字符串修改函数:返回void或char*?

字符串修改函数:返回void或char*?,c,string,function,pointers,C,String,Function,Pointers,例如: void foo1(char *buffer) { buffer[0] = 'a'; } char *foo2(char *buffer) { buffer[0] = 'a'; return buffer; } 当我想要修改字符串时,我可以执行以下操作: mystr[] = "foobar"; foo1(mystr); printf("%s",mystr); 或使用返回值: mystr[] = "foobar"; char *mystr2; mystr2 =

例如:

void foo1(char *buffer) {
    buffer[0] = 'a';
}

char *foo2(char *buffer) {
    buffer[0] = 'a';
    return buffer;
}
当我想要修改字符串时,我可以执行以下操作:

mystr[] = "foobar";
foo1(mystr);
printf("%s",mystr);
或使用返回值:

mystr[] = "foobar";
char *mystr2;
mystr2 = foo2(mystr);
printf("%s",mystr2);
第二种方式让我有点困惑:mystr和mystr2指向不同的位置,但持有相同的字符串。我以为foo2会在返回时将修改后的mystr的地址复制到mystr2。会发生什么

第二个问题是:哪种修改字符串的方法更标准?

我推荐

char *foo( char *str );
您总是可以忽略返回的值,这样更灵活。你不能用

void foo( char *str );
作为功能参数:

int someFunc( char *val );
...
int rc = someFunc( foo( data ) );
哪种修改字符串的方式更标准

标题
中声明的标准C字符串函数通常返回指向目标字符串的指针。这允许将字符串函数链接在一起。例如,相对于您可以编写的第二个函数定义

printf("%s", foo2(mystr));
语句输出修改后的源字符串

在这个代码片段中

char mystr[] = "foobar";
char *mystr2;
mystr2 = foo2(mystr);
printf("%s",mystr2);
作为参数传递给函数的字符数组
mystr[]
隐式转换为指向其第一个字符的指针。并且从被调用函数返回相同的地址,该函数是指向数组第一个字符的指针。因此,在这一声明之后

mystr2 = foo2(mystr);
指针
mystr2
也指向字符数组
mystr
的第一个字符

函数
printf
可以按如下方式调用

printf("%s",mystr);
或者

printf("%s",mystr2);

因为在这两种情况下都将相同的地址传递给函数,并且在第一种情况下传递给函数
printf
的字符数组被隐式转换为指向其第一个字符的指针。

在第二个示例中,修改了
mystr
,并且
mystr2
指向
mystr
。在第二个示例中,也可以尝试打印
mystr
。不清晰且不宽泛。每个问题一个问题。至于你的第二个问题,答案是:两个都有,没有。哪一个是“最佳”(高度主观)取决于您的用例。对于第二个问题,您可以执行例如
printf(“%s”,foo2(mystr))
,这在某些情况下可能有用,但在其他情况下可能不有用。@Olaf-问题足够清楚,而且关系非常密切,以至于不会违反您引用的任何规则。@ryker:第二个问题没有关系,只是征求意见。我说它太宽泛了,因为根据用例可能会有建议。如果你称之为“基于意见”,我很好。使用返回指针的函数的结果作为函数参数可能非常糟糕。而且非常难看,使代码更难阅读,还有其他一些事情。我不明白为什么有些程序员如此关心让代码不可读。就像说“更少的变量”,这有什么好处呢?让我们考虑<代码> STRCAT/CODE >。从可读性的角度来看,我们宁愿不要它:
print(a+b)
。但是在C语言中我们别无选择,我们必须编写strcat(a,b)。现在如果strcat是一个空函数,我们必须写:
strcat(a,b);打印(a)
是否查看问题?这里的意图不是很清楚。我们确实写下了我们是如何做事的,但我们所做的必须重新构建。然而,
print(strcat(a,b))
更接近于表达我们试图做的事情。对这个答案进行了投票:它准确地回答了问题,没有太多的单词。@IharobAlAsimi使用返回指针作为函数参数的函数的结果可能非常糟糕。这也是返回
char*
提供的灵活性的一个例子。返回
char*
允许函数执行
void
函数所做的一切,然后执行更多操作。与@linuxfan的注释相同。简洁明了。