我如何使一个字符串数组与交换函数互换其组件?

时间:2019-02-05 12:31:12

标签: c swap pass-by-value function-call

问题在于此代码不会互换这两个字符串。我是编程新手,但是我可以说问题出在那个交换功能上,但是我不知道如何解决它。

我试图在交换中添加strcpy而不是“ =”,但这没有用。

a

3 个答案:

答案 0 :(得分:6)

您想在这里使用参数,并且由于您的字符串表示为指针,因此需要指向指针的指针:

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

这样称呼它:

swap(&s[0], &s[1]);

  

我试图在交换中添加strcpy而不是“ =”,但这没有用。

之所以不起作用,是因为字符串实际上存储在程序的二进制文件中,因此无法进行修改,而您可以使用strcpy覆盖它们。如果将它们复制到堆栈或堆中,则可以使用strcpy进行交换。当然,这将不只是交换指针而效率低下,但这就是它的样子:

void swap(char *t1, char *t2) {
    char buf[16]; // needs to be big enough to fit the string
    strcpy(buf, t1);
    strcpy(t1, t2);
    strcpy(t2, buf);
}

此外,您需要将s的定义更改为类似于

的内容
char s[2][16] = { "Hello", "World" }; // strings are copied to the stack now

答案 1 :(得分:2)

仔细检查类型。

作为数组成员,您得到的是指针(指向字符串文字的起始元素)。您需要以某种方式交换成员,以便它们指向另一个字符串文字。因此,您需要自己更改这些指针。

因此,您需要将指针传递给这些指针,然后从调用的函数进行更改。

做类似的事情

swap(&(s[0]), &(s[1]));

然后在调用的函数中:

void ptrSwap(char **t1, char **t2) {
    char *temp;
    temp=*t1;
    *t1=*t2;
    *t2=temp;
}

加分点:有意义地命名您的函数(以及变量,如果适用)。

答案 2 :(得分:2)

您需要传递指针的指针,即存在字符串的数组中位置的地址,以便您可以在其中交换并放置正确的地址。

尝试以下代码:

#include <stdio.h>
#include <stdlib.h>

void swap(char **t1, char **t2) {
    char *t;
    t=*t1;
    *t1=*t2;
    *t2=t;
}
int main() {
    char *s[2] = {"Hello", "World"};
    swap(&s[0], &s[1]);
    printf("%s\n%s", s[0], s[1]);
    return 0;
}

输出:

World
Hello