【问题标题】:string modifying function: return void or char*?字符串修改函数:返回 void 还是 char*?
【发布时间】:2017-05-23 20:53:09
【问题描述】:

例如:

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

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

【问题讨论】:

  • 第二个例子中mystr被修改,mystr2指向mystr。尝试在第二个示例中打印mystr
  • 不清楚且范围广泛。每个问题一个问题。
  • 至于你的第二个问题,答案是:两者都没有。哪一个是“最好的”(高度主观的)取决于您的用例。用第二个你可以做例如printf("%s", foo2(mystr)) 这可能在某些情况下有用,但在其他情况下则不然。
  • @Olaf - 问题足够清楚,并且密切相关,不会违反您引用的任何规则。
  • @ryyker:第二个问题不相关,征求意见。我说它太宽泛了,因为可以根据用例提出建议。因此,如果您称其为“基于意见”,那我很好。

标签: c string function pointers


【解决方案1】:

我会推荐

char *foo( char *str );

你总是可以忽略返回值,而且更灵活。你不能用

void foo( char *str );

作为函数参数:

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

【讨论】:

  • 使用返回指针作为函数参数的函数结果可能非常糟糕。而且也很丑陋,使代码更难阅读,还有其他一些事情。我不明白为什么有些程序员如此关心让代码一文不值。就像说“更少的变量”,这样做有什么好处?
  • 让我们考虑strcat。从可读性的角度来看,我们宁愿根本没有它:print(a + b)。但是在 C 中我们别无选择,我们必须写 strcat(a,b)。现在如果 strcat 是一个 void 函数,我们必须写: strcat(a,b); print(a) 看到问题了吗?这里的意图不是很清楚。我们准确地写了我们如何做事,但我们正在做的事情必须重新构建。而print(strcat(a,b)) 更接近于表达我们正在尝试做的事情。
  • 赞成这个答案:它准确地回答了所问的问题,没有太多的话。
  • @IharobAlAsimi 使用返回指针作为函数参数的函数结果可能非常糟糕。而且也很丑 这只是返回char * 提供的灵活性的一个例子。返回char * 允许函数执行void 函数所做的所有操作 - 然后执行更多操作。
  • 同上@linuxfan 的评论。简洁明了。
【解决方案2】:

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

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

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

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

在这段代码中sn-p

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 的字符数组又被隐式转换为指向其第一个字符的指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 2013-10-22
    • 2020-10-15
    相关资源
    最近更新 更多