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

3

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

例如,我有这个函数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语言中指针和字符串有些困惑。


不是完全相同的问题,但是同样的问题:https://dev59.com/alkS5IYBdhLWcg3ww49d - user694733
3个回答

4

问题

在函数foo()中:

int foo(char *return_string) {
    char *tmp = "new string";
    return_string = tmp;
    return 0;
}

你只是将指针tmp分配给指针return_string。 参数return_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;
}

return_string = &tmp; should be *return_string = tmp; - mch
@mch tmp 具有自动存储期限,因此在离开函数后它将不再存在。这句话根本没有意义。 - JFMR
如果 tmp 指向字符串常量,那么 *return_string = tmp; 是可以的。使用 &tmp 是危险的。 - mch
如果我通过引用传递指针,那么我应该这样调用 foo 吗?char *s = "old string"; foo(&s); printf("%s\n", s); - Robb1
是的,为了通过引用传递指针s,请使用foo(&s)(即:传递指针的地址)。 - JFMR

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

没有任何保证参数是动态分配的。 - Jean-François Fabre
尝试char *test="hello"; foo(&hello);=>砰!当传递指向指针的指针时,调用者负责内存泄漏。 - Jean-François Fabre
当然可以。您需要就如何分配字符串达成一些约定。如果使用动态分配,这是最通用的解决方案(您将需要避免存储常量,但这并不是最糟糕的限制。例如,当您使用基于strcpy的方法时,您需要担心缓冲区大小。所有选项都有各自的缺点。最好的解决方案可能是使用自己的字符串容器,并附带一个明确的销毁指针.. 但这可能超出了当前问题的范围。 - AndreyS Scherbakov

0

你正在按值传递指针。你需要按引用传递指针。

更改函数接口,将char* return_string替换为char** return_string。 然后执行*return_string = tmp;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接