printf ascii char%有时给出c而不是%

Joh*_*han 6 c printf ascii

我对printf如何处理ascii字符有点困惑.

当我像这样打印字符%时,我得到一个正确的响应,如"ascii%",这很好.

printf("ascii %%   \n");
printf("ascii \x25 \n");
printf("ascii %c   \n", 0x25);

ascii % 
Run Code Online (Sandbox Code Playgroud)

我可以把它们放在同一条线上,然后我得到"ascii %%",这也很好.

printf("ascii %c \x25 \n", 0x25);

ascii % %
Run Code Online (Sandbox Code Playgroud)

但是我不能以其他顺序那样做,因为那时我得到c而不是%,就像这个"ascii%c"

printf("ascii \x25 %c \n", 0x25);

ascii %c
Run Code Online (Sandbox Code Playgroud)

怎么了?

但是我注意到printf看起来像正常的%符号一样处理\ x25,因为如果我在输出后直接添加另一个%(\ x25%)它就会成为我的期望.

printf("ascii \x25% %c \n", 0x25);

ascii % %
Run Code Online (Sandbox Code Playgroud)

但后来我也注意到打印一个%也似乎有效,但我没想到.

printf("ascii %  \n");

ascii %
Run Code Online (Sandbox Code Playgroud)

为什么这样做,我认为单个%不是printf的有效输入...有人可以澄清printf应该如何工作吗?


注意:我在Ubuntu 12.04(gcc版本4.6.3)上使用默认gcc.

Did*_*set 7

在C字符串语法中,转义字符\启动转义序列,编译器使用该转义序列生成将包含在最终二进制文件中的实际字符串.因此,在C源代码中,"%"和"\ x25"将在最终二进制文件中生成完全相同的字符串.

关于单一%,这是格式错误的格式字符串.它导致未定义的行为.因此

printf("ascii \x25 %c \n", 0x25);
Run Code Online (Sandbox Code Playgroud)

实际上是完全相同的

printf("ascii % %c \n", 0x25);
Run Code Online (Sandbox Code Playgroud)

它导致未定义的行为.没有什么可做的,试图了解单个百分比字符发生的事情是浪费时间.