字符串修改功能:返回void或char *?

时间:2017-01-09 14:53:26

标签: 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 = foo2(mystr);
printf("%s",mystr2);

我对第二种方式感到有点困惑:mystr和mystr2指向不同的位置,但持有相同的字符串。我以为foo2会在返回时将修改后的mystr的地址复制到mystr2。会发生什么呢?

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

2 个答案:

答案 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 ) );
相关问题