我有一个函数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;
}
我期待
这个和那个
在程序运行时打印,但我看到:
这
是否有人能够指导我完成程序实际执行的操作,更重要的是,我做错了什么?
答案 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*
。这是因为不应修改字符串文字。