例如:
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。会发生什么呢?
第二个问题是:修改字符串的哪种方式更标准?
答案 0 :(得分:4)
修改字符串的哪种方式更标准?
标头<string.h>
中声明的标准C字符串函数通常返回指向目标字符串的指针。这允许将字符串函数链接在一起。例如,相对于您的第二个函数定义,您可以编写
printf("%s", foo2(mystr));
并且语句输出修改后的源字符串。
在此代码段中
char mystr[] = "foobar";
char *mystr2;
mystr2 = foo2(mystr);
printf("%s",mystr2);
作为参数传递给函数的字符数组mystr[]
被隐式转换为指向其第一个字符的指针。并且从被调用函数返回相同的地址,该函数是指向数组的第一个字符的指针。因此在此声明之后
mystr2 = foo2(mystr);
指针mysstr2
也指向字符数组mystr
的第一个字符。
函数printf
可以像
printf("%s",mystr);
或喜欢
printf("%s",mystr2);
因为在这两种情况下都将相同的地址传递给函数,并且在第一种情况下传递给函数printf
的字符数组被隐式转换为指向其第一个字符的指针。
答案 1 :(得分:1)
我建议
char *foo( char *str );
您始终可以忽略返回的值,并且它更灵活。你不能使用
void foo( char *str );
作为函数参数:
int someFunc( char *val );
...
int rc = someFunc( foo( data ) );