1

我已经编写了交换字符串的代码,但我无法交换。问题是什么,如何通过使用函数来解决它swap

#include <stdio.h>

void swap( char*,char*);
int main()
{
    char *ptr[2] = {"hello", "morning"};
    swap(ptr[0], ptr[1]);
    printf("%s %s", ptr[0], ptr[1]);
    return 0;
}

void swap(char *t1, char*t2)
{
    char *t;
    t = t1;

    t1 = t2;
    t2 = t;
}

我也尝试过(&ptr[0], &ptr[1]),但这里显示的是segmentation fault. 我也做了一个 char, *p1 = ptr[0], char *p1 = ptr[1], 然后传递&p1, 和&p2to swap,但我仍然遇到分段错误。

4

4 回答 4

8

C 函数参数是按值传递的。您将地址的值传递给您的swap函数,并期望这些值(地址)发生变化。但只有函数中地址的副本swap会发生变化。

要更改实际传入的地址,您需要额外的参考级别:

void swap(char **t1, char **t2)
{
    char *t;

    t = *t1;
    *t1= *t2;
    *t2 = t;
}

并这样称呼它swapswap(&ptr[0], &ptr[1]);

于 2012-07-28T19:16:02.197 回答
6

您需要传入指向 char 数组指针的指针才能切换它们。通过这样做,您可以交换这些指针的值。(哪些是实际的数组。)

#include<stdio.h>
void swap( char**,char**);
int main()
{
        char *ptr[2] = {"hello","mornig"};
        swap(&ptr[0], &ptr[1]);
        printf("%s %s",ptr[0], ptr[1]);
        return 0;
}

void swap( char **t1,char **t2)
{
        char *t;
        t = *t1;

        *t1 = *t2;
        *t2 =t;
}
于 2012-07-28T19:15:59.743 回答
3

您需要将指针传递给您的字符串以交换它们(char**)。否则,您所做的更改将是本地交换功能。

void swap( char **t1,char **t2)
{
        char *t;
        t = *t1;

        *t1 = *t2;
        *t2 =t;
}

int main()
{
        char *ptr[2] = {"hello","mornig"};
        swap(&ptr[0], &ptr[1]);
        printf("%s %s",ptr[0],ptr[1]);
        return 0;
}
于 2012-07-28T19:15:30.803 回答
1

char *ptr[2] = {"hello","mornig"};- 该语句意味着您正在分配一个大小为 2 的数组,该数组将存储两个字符串的地址(即char *)。现在,您提供的两个字符串将在text segment其中是只读数据。如果我们试图修改它,这将导致崩溃(sgmentation fault)。

所以如果你打电话swap(&ptr[0], &ptr[1])会导致崩溃。因为您试图m在第一个只读字符串中写入字符h。无法写入 中的字符串text segment

如果你想简单地交换一个字符串,你可以调用函数 as swap(&ptr[0], &ptr[1]),相当于swap((ptr + 0),(ptr + 1));.

并更改交换功能如下

void swap( char **t1,char **t2)
{
        char *t;

        t = *t1;
        *t1 = *t2;
        *t2 =t;
}

这里我们只是交换存储在数组指针中的字符串的地址ptr

于 2012-07-29T06:59:05.387 回答