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

时间:2013-08-05 07:02:31

标签: c ascii printf

我对printf如何处理ascii字符感到有点困惑。

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

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

ascii % 

我可以把它们放在同一条线上,然后我得到“ascii %%”, 那也没关系。

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

ascii % %

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

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

ascii %c

发生了什么事?

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

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

ascii % %

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

printf("ascii %  \n");

ascii %

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


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

3 个答案:

答案 0 :(得分:7)

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

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

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

完全相同
printf("ascii % %c \n", 0x25);

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

答案 1 :(得分:2)

是的,printf确实像正常的%符号那样处理\ x25,printf("ascii % \n");有效,因为%位于格式字符串的末尾(忽略空格)。

答案 2 :(得分:1)

格式printf("ascii \x25 %c \n", 0x25);,因为您推测\ x25与'%'字符完全相同,因此{percent} {space} {percent} {c}。所以,它打印一个带有前导空格的百分号,然后是'c'。

[编辑:我说的没有前导空格,因为'c'不是数字说明符] [编辑2:参数“,0x25”被忽略,因为没有匹配的说明符可以使用它]