我对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。
答案 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”被忽略,因为没有匹配的说明符可以使用它]