使用Macro获得的输出的说明

时间:2015-05-20 06:23:48

标签: c macros printf

为什么第二个'%'没印?

另外,如果我输入printf(scanf, scanf, scanf);

,它为什么会提供相同的输出
# include <stdio.h>
# define scanf  "%s Geeks Quiz "
int main()
{
printf(scanf, scanf);
return 0;
}

3 个答案:

答案 0 :(得分:3)

  

为什么第二个%没有打印?

答:让我们根据您的用法使用printf()签名,我们是吗?

根据man page,签名

int printf(const char *format, ...);

和你的用法

printf(scanf, scanf);

在这里,

  • first 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 "