如何修改函数中作为参数传递的字符串的值?
例如,我有此功能foo
(应该将return_string
的值从"old string"
更改为"new string"
):
int foo(char *return_string) {
char *tmp = "new string";
return_string = tmp;
return 0;
}
但如果我按以下方式调用它:
char *s = "old string";
foo(s);
printf("%s\n", s);
我仍然以old string
作为输出。为什么呢?
我承认我对C中的指针和字符串有点混淆。
答案 0 :(得分:1)
在函数foo()
中:
int foo(char *return_string) {
char *tmp = "new string";
return_string = tmp;
return 0;
}
您只是将指针tmp
分配给指针return_string
。参数retrun_string
通过值传递给foo()
(即:它是调用者传递的内容的副本)。 return_string
指向的是什么(正如你想要的那样),也没有通过的指针将修改保留在调用者的一侧。
strcpy()
请考虑使用strcpy()
:
int foo(char *return_string) {
char *tmp = "new string";
strcpy(return_string, tmp);
return 0;
}
这将修改return_string
指向的字符串的内容。
通过引用传递指针,可以修改指向字符串的指针:
int foo(char **return_string) {
char *tmp = "new string";
*return_string = tmp;
return 0;
}
答案 1 :(得分:0)
您正在按值传递指针。您需要通过引用传递指针。
更改功能界面以传递char** return_string
而不是char* return_string
。
然后做*return_string = tmp;
。
答案 2 :(得分:0)
如果您的字符串是动态分配的,则可以按如下方式实现
int foo(char **return_string) {
if (*return string) free(*return_string)
*return_string = strdup("new string");
return 0;
}
char* s = strdup("original");
foo(&s);
....