解释这个C代码片段 - printf()函数参数会发生什么?

时间:2014-11-30 06:06:03

标签: c string function escaping printf

任何人都可以解释一下输出是什么以及如何输出?我无法理解printf()函数参数。我想知道它们之间的区别 1和2 ,以及 3和4 printf()语句。通常在printf()中,我们应该将控制字符串作为第一个参数。但即使交换参数,我也能获得相同的输出吗?

#include <stdio.h>

int main()
{
    char *str;
    str = "%s";
    printf("%s\n", str);  //.....1
    printf(str, "%s\n");  //.......2
    printf(str, "K\n");   //.......3
    printf("K\n", str);   //........4
    return 0;
}

2 个答案:

答案 0 :(得分:2)

最好将代码放入编译器并查看输出。它可能会提供更好的洞察力,而不是在Stack Overflow中提出要求。

预期输出为:

  1. [%s \ n],因为str包含%s,它将按原样打印。

  2. [%s \ n],因为str包含格式,第二个参数将被打印。如果str来自用户,则此表格非常危险。

  3. [K \ n]与2相同。

  4. [K \ n] str被忽略。如果通过命令行参数正确配置,gcc将发出警告。

  5. 结论 - 始终使用#1。

答案 1 :(得分:1)

printf函数参数由

组成
  

(1)初始shift state
  (2)format string
  (3)list of arguments

在你的情况下,你有:

printf("%s\n",str);  //.....1

没有移位,一个格式字符串,它带有刺痛str = %s并按字面打印。

printf(str, "%s\n");//.......2

str的值没有数字移位(再次0)和打印的文字%s

printf(str, "K\n"); //.......3

您再次获得str和初始转移0的值,但包含打印的文字格式字符串K

printf("K\n",str);   //........4

最后,您有一个格式字符串,其转换说明符数量不足,会生成警告:

foo.c:11:1: warning: too many arguments for format [-Wformat-extra-args]
 printf("K\n",str);   //........4

但其中包含再次打印的文字格式字符串K。总之,代码的输出是:

%s
%s
K
K