【问题标题】:Explain this C code snippet — what will happen with printf() function arguments?解释这个 C 代码片段—— printf() 函数参数会发生什么?
【发布时间】:2014-11-30 06:06:02
【问题描述】:

谁能解释一下输出是什么以及如何输出?我无法理解 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;
}

【问题讨论】:

  • printf() 的第一个参数是一个字符串——它可能是(而且经常是)字符串文字,但不一定是。第一个参数控制来自printf() 的输出;其他人可能会改变输出。前两个输出%s 和一个换行符;第三个和第四个都输出K 和一个换行符。请注意,第四个不需要 str 参数。您应该能够通过运行代码并仔细考虑 printf() 函数看到的内容来看到这一点。

标签: c string function escaping printf


【解决方案1】:

最好将代码放入编译器并查看输出。与在 Stack Overflow 中询问相比,它可能会提供更好的洞察力。

预期的输出是:

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

  2. [%s\n] 因为 str 包含格式并且将打印第二个参数。如果 str 来自用户,这种形式是非常危险的。

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

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

结论——总是使用#1。

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      相关资源
      最近更新 更多