返回字符串的函数的意外输出

时间:2015-08-18 01:24:27

标签: c arrays string function

我有一个函数stuff(),它返回一个要从main打印的字符串。

#include <stdio.h>

char* stuff(char* thing) {
        return ("this and %s", thing);
}

int main() {
        char* thing = "that";
        printf("%s\n", stuff(thing));
        return 0;
}       

我期待

  

这个和那个

在程序运行时打印,但我看到:

  

是否有人能够指导我完成程序实际执行的操作,更重要的是,我做错了什么?

2 个答案:

答案 0 :(得分:8)

您正在使用带有逗号运算符的表达式作为函数的返回值。

逗号运算符计算两个操作数(逗号两侧的表达式),表达式的结果是计算第二个表达式的结果:右侧的表达式逗号。在您的情况下,第二个表达式是结果,因此作为函数的返回值返回。

因此函数中return语句的结果等同于:

return thing;

这就是为什么函数的结果是字符串"that"

您似乎期望从此表达式中获得某种printf样式字符串格式:

("this and %s", thing);

但它不会像这样工作:它只是一个使用逗号运算符的表达式。

在C中,连接字符串并不容易。查看标准字符串strcat系列函数(请参阅strncat here的文档),或sprintf函数系列之一(snprintf {的文档{3}})。

答案 1 :(得分:2)

pbq2's answer很好地解释了为什么你得到了由于逗号运算符而得到的预期输出。所以我想解决你的期望,看起来你期待某种字符串格式化表达式就像你在其他语言如python中看到的那样。不幸的是,在C中没有发生这样的行为。你需要使用类似snprintf之类的东西来做你想做的事。

#include <stdio.h>

char* stuff(const char* thing) {
    char* ret = malloc(100);//make sure you deallocate this later!
    snprintf(ret, 100, "this and %s", thing);
    return ret;
}

int main() {
    const char* thing = "that";
    printf("%s\n", stuff(thing));
    return 0;
}

另外,您可能会注意到我已将原始代码更改为使用const char*。这是因为不应修改字符串文字。