%%在printf中做了什么?

时间:2013-09-24 17:22:19

标签: c io

考虑到C中的以下程序,

#include <stdio.h>

int main() 
{ 
    printf(" \"Books %% OR %% apparels\""); 
    getchar(); 
    return 0; 
}

该程序打印书籍%OR%服装, 我想知道%%的重要性,因为它看起来没必要。

1 个答案:

答案 0 :(得分:3)

%表示格式转义序列,用于格式化传递给printf()的变量。

所以你必须逃避它才能打印%字符。

http://en.cppreference.com/w/c/io/fprintf


如果您将%%替换为%,就像这样

#include <stdio.h>
int main (int argc, char *argv[]) {
    printf(" \"Books % OR % apparels\"");
    return 0;
}

printf()有两个转义序列:

  1. "% O"

    [guesswork]这不会产生有效的转义序列,因此printf()忽略它并按原样打印。

  2. "% a"

    printf()会尝试从参数列表中获取float并将其打印为“十六进制浮点,小写”(%a,请参阅上面的网页)。由于C调用约定(免责声明:我不是这方面的专家),使用了一些来自内存的垃圾,这解释了结果。

  3. 实际上我的编译器(gcc 4.4.3)向两者发出了警告:

    $ gcc a.c
    a.c: In function ‘main’:
    a.c:3: warning: unknown conversion type character ‘O’ in format
    a.c:3: warning: too few arguments for format