我如何使字符串数组与交换函数交换它的组件?
How I can make a string array interchange it's components with a swap function?
问题是此代码不会互换这 2 个字符串。我是编程新手,但我可以看出问题出在交换功能上,但我不知道如何解决它。
我尝试在交换中添加 strcpy 而不是“=”,但没有成功。
#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;
}
你想在这里使用 out 参数,并且由于你的字符串表示为指针,所以你需要指向指针的指针:
void swap(char **t1, char **t2) {
char *t;
t = *t1;
*t1 = *t2;
*t2 = t;
}
这样称呼它:
swap(&s[0], &s[1]);
I tried to add strcpy instead of "=" in swap but that didn't worked.
之所以不起作用,是因为字符串实际上存储在程序的二进制文件中,因此无法修改,而使用 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
仔细检查类型。
作为数组成员,您得到的是指针(指向字符串文字的起始元素)。您需要以某种方式交换成员,以便它们指向另一个字符串文字。因此,您需要自己更改这些指针。
因此,您需要将指针传递给这些指针,然后从被调用的函数中进行更改。
做类似的事情
swap(&(s[0]), &(s[1]));
然后,在调用的函数中:
void ptrSwap(char **t1, char **t2) {
char *temp;
temp=*t1;
*t1=*t2;
*t2=temp;
}
加分:有意义地命名您的函数(和变量,也适用)。
您需要传递指针的指针,即数组中字符串所在位置的地址,以便您可以交换并放置正确的地址。
试试下面的代码:
#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
问题是此代码不会互换这 2 个字符串。我是编程新手,但我可以看出问题出在交换功能上,但我不知道如何解决它。
我尝试在交换中添加 strcpy 而不是“=”,但没有成功。
#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;
}
你想在这里使用 out 参数,并且由于你的字符串表示为指针,所以你需要指向指针的指针:
void swap(char **t1, char **t2) {
char *t;
t = *t1;
*t1 = *t2;
*t2 = t;
}
这样称呼它:
swap(&s[0], &s[1]);
I tried to add strcpy instead of "=" in swap but that didn't worked.
之所以不起作用,是因为字符串实际上存储在程序的二进制文件中,因此无法修改,而使用 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
仔细检查类型。
作为数组成员,您得到的是指针(指向字符串文字的起始元素)。您需要以某种方式交换成员,以便它们指向另一个字符串文字。因此,您需要自己更改这些指针。
因此,您需要将指针传递给这些指针,然后从被调用的函数中进行更改。
做类似的事情
swap(&(s[0]), &(s[1]));
然后,在调用的函数中:
void ptrSwap(char **t1, char **t2) {
char *temp;
temp=*t1;
*t1=*t2;
*t2=temp;
}
加分:有意义地命名您的函数(和变量,也适用)。
您需要传递指针的指针,即数组中字符串所在位置的地址,以便您可以交换并放置正确的地址。
试试下面的代码:
#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