为什么第二个'%'没印?
另外,如果我输入printf(scanf, scanf, scanf);
?
# include <stdio.h>
# define scanf "%s Geeks Quiz "
int main()
{
printf(scanf, scanf);
return 0;
}
答案 0 :(得分:3)
为什么第二个
%
没有打印?
答:让我们根据您的用法使用printf()
签名,我们是吗?
根据man page,签名
int printf(const char *format, ...);
和你的用法
printf(scanf, scanf);
在这里,
scanf
代表format
字符串,其中包含转化说明符。scanf
是与%s
中第一个printf()
对应的参数。从本质上讲,您的printf()
看起来像是
printf("%s Geeks Quiz", "%s Geeks Quiz");
^ |-------------|
|
conversion argument for %s
specifier
因此,根据printf()
的工作原理,第一个%s
被%s Geeks Quiz
取代(此处,%s
是输出的一部分,不作为格式处理说明符)。
所以,你的最终o / p看起来像是
%s Geeks Quiz Geeks Quiz
此外,如果我输入
,它为何会提供相同的输出printf(scanf, scanf, scanf);?
Ans:printf(scanf, scanf, scanf);
将产生与上面相同的输出,因为,根据C11
标准,第7.21.6.1章,fprintf()
函数,
如果参数保留时格式已用尽,则多余的参数为 评估(一如既往)但被忽略。
根据上面的解释,我们只有一个格式说明符%s
(来自第一个scanf
替换),并且完全需要一个argumnet。因此,第三个scanf
被忽略了。
答案 1 :(得分:1)
只有第一个字符串是实际的格式化字符串,它是printf
查找格式代码(如"%s"
)所经历的字符串。当它找到格式化代码时,用相应的后续参数替换它。
因此,如果格式字符串是"%s Geeks Quiz "
,它将用格式字符串后面的第一个参数替换"%s"
,如果它是相同的字符串,那么输出将是"%s Geeks Quiz Geeks Quiz "
如果存在与相应格式代码不匹配的参数,则忽略它。
此外,这与宏无关。
答案 2 :(得分:1)
宏扩展为:
printf("%s Geeks Quiz ", "%s Geeks Quiz ");
其中第一个字符串是打印格式字符串,第二个字符串是传递给该字符串的参数。
因此第二个字符串将放入第一个字符串的%s位置:
"%s Geeks Quiz "
^
Insert second string "%s Geeks Quiz " here.
"%s Geeks Quiz Geeks Quiz "