解释C代码片段:预处理器+ printf =?

时间:2010-09-04 07:06:44

标签: c printf c-preprocessor

此代码段的输出为%s is a string is a string。请解释一下。

#include <stdio.h>

#define scanf "%s is a string"

int main()
{
    printf(scanf, scanf);  
}

5 个答案:

答案 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");