修改在C中作为函数的参数传递的字符串

时间:2018-01-17 09:04:03

标签: c string pointers

如何修改函数中作为参数传递的字符串的值?

例如,我有此功能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中的指针和字符串有点混淆。

3 个答案:

答案 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);
....