c-string修改函数:返回void还是char*



例如:

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。相反会发生什么?

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

哪种修改字符串的方式更标准?

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

printf("%s", foo2(mystr));

并且该语句输出修改后的源字符串。

在这个代码片段

char mystr[] = "foobar";
char *mystr2;
mystr2 = foo2(mystr);
printf("%s",mystr2);

作为自变量传递给函数的字符数组CCD_ 2被隐式转换为指向其第一个字符的指针。并且从被调用的函数返回相同的地址,该函数是指向数组第一个字符的指针。因此,在此声明之后

mystr2 = foo2(mystr);

指针CCD_ 3也指向字符阵列CCD_。

函数printf可以像一样调用

printf("%s",mystr);

或类似

printf("%s",mystr2);

因为在两种情况下相同的地址被传递给函数,并且在第一种情况下传递给函数CCD_。

我推荐

char *foo( char *str );

您可以随时忽略返回的值,而且它更灵活。你不能使用

void foo( char *str );

作为函数参数:

int someFunc( char *val );
...
int rc = someFunc( foo( data ) );

相关内容

最新更新