此代码段的输出为%s is a string is a string
。请解释一下。
#include <stdio.h>
#define scanf "%s is a string"
int main()
{
printf(scanf, scanf);
}
答案 0 :(得分:6)
您希望我们究竟解释什么?将宏替换为
printf("%s is a string", "%s is a string");
其余的是printf
的预期正常日常行为。
P.S。 #define scanf ...
...
答案 1 :(得分:2)
预处理器进行盲目替换以给出:
printf("%s is a string","%s is a string");
第一个参数中的%s
是字符串的格式说明符,并替换为第二个参数。第二个参数中的%s
没什么特别的。
答案 2 :(得分:1)
这是一些相当离奇的代码,但输出结果为“%s是一个字符串是一个字符串”,因为在两种情况下scanf都扩展为“%s是一个字符串”,然后printf将其替换为%s
答案 3 :(得分:1)
printf(“%s是一个字符串”,“%s是一个字符串”);
我猜混淆是printf将对第二个%s做什么。 要清除它,printf不是递归函数。如果要打印字符串,并且该字符串具有任何格式标识符,则不将其视为格式标识符。它被认为是普通字符串。所以在这种情况下,第二个“%s是一个字符串”只是一个普通的字符串。此字符串中的%s不是format-identifier。
如果你有像printf这样的东西(“%s%s是一个字符串”,“%s%s是一个字符串”); 然后是的,你会得到运行时错误,说printf缺少一些参数。
答案 4 :(得分:0)
要理解这段代码,请逐一运行以下语句: -
printf("%s is a string","StRiNG");
printf("%s %s is a string","StRiNG");
printf("%s is a string","StRiNG","Hey");