6

我对 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。

4

3 回答 3

7

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

关于 single %,这是一个格式错误的格式字符串。它会导致未定义的行为。所以

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

实际上与

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

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

于 2013-08-05T07:13:34.887 回答
2

是的, printf 确实将 \x25 视为正常的 % 符号,printf("ascii % \n");因为%它位于格式字符串的末尾(忽略空格)。

于 2013-08-05T07:13:27.807 回答
1

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

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

于 2013-08-05T07:15:50.587 回答