【发布时间】:2010-09-04 07:06:44
【问题描述】:
此代码 sn-p 的输出是 %s is a string is a string。请解释一下。
#include <stdio.h>
#define scanf "%s is a string"
int main()
{
printf(scanf, scanf);
}
【问题讨论】:
标签: c printf c-preprocessor
此代码 sn-p 的输出是 %s is a string is a string。请解释一下。
#include <stdio.h>
#define scanf "%s is a string"
int main()
{
printf(scanf, scanf);
}
【问题讨论】:
标签: c printf c-preprocessor
您究竟想让我们解释什么?代入宏得到
printf("%s is a string", "%s is a string");
其余的是printf的预期正常日常行为。
附: #define scanf ...???
【讨论】:
printf 就是这样工作的,printf 就是这样工作的。当你在你最喜欢的 C 书籍或文档中阅读printf 的描述时,有什么不明白的地方吗?
printf() 调用的格式字符串是 "%s is a string"。有一个"%s" 格式,因此它采用相应的参数并将其替换为字符串。第一个参数是字符串"%s is a string"。把它们放在一起,"[%s is a string] is a string" 被打印出来了(为了强调而添加了括号)。
预处理器进行盲替换以给出:
printf("%s is a string","%s is a string");
第一个参数中的%s 是字符串的格式说明符,并替换为第二个参数。第二个参数中的 %s 没有什么特别之处。
【讨论】:
这是一些相当奇怪的代码,但输出将是“%s is a string is a string”,因为在这两种情况下 scanf 都被扩展为“%s is a string”,然后 printf 将其替换为 %s .
【讨论】:
printf("%s 是字符串","%s 是字符串");
我猜想混淆是 printf 将如何处理第二个 %s。 要清除这一点, printf 不是递归函数。如果您正在打印一个字符串并且该字符串具有任何格式标识符,则它不被视为格式标识符。它被认为是纯字符串。所以在这种情况下,第二个“%s is a string”只是一个普通字符串。此字符串中的 %s 不是格式标识符。
如果你有类似 printf("%s %s is a string", "%s %s is a string"); 那么是的,你会得到运行时错误,说 printf 缺少一些参数。
【讨论】:
要理解这段代码,请一一运行以下语句:-
printf("%s is a string","StRiNG");
printf("%s %s is a string","StRiNG");
printf("%s is a string","StRiNG","Hey");
【讨论】: