【发布时间】:2013-08-05 19:30:00
【问题描述】:
我对 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。
【问题讨论】:
-
好问题!你没有收到
"ascii % \n"的警告吗? -
"\x25 %c" 给出“警告:转换在格式结尾缺少类型 [-Wformat]”,但这与空间有关,因为“\x25%c”编译时没有任何警告。
-
没有。它与空间无关,至少没有直接关系。实际上,当
printf看到第一个%时,它开始解释格式化序列。空格在数字或字符串的格式化序列中可以是有效的,因此可以接受空格。但随后,没有找到显示警告的其他格式字符 (d, x, s, ...)。另一方面,当没有空格时,格式化序列只是由两个连续的百分比组成,因此是有效的。