例如:
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 ) );