【问题标题】:printf the ascii char % sometimes gives c and not %printf ascii char % 有时给出 c 而不是 %
【发布时间】: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, ...)。另一方面,当没有空格时,格式化序列只是由两个连续的百分比组成,因此是有效的。

标签: c ascii printf


【解决方案1】:

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

【讨论】:

  • 错误:printf 永远不会看到\x25
  • 所以是预加载器将 \x25 转换为 % 以便 printf 在运行时获得相同的输入?
  • @Johan 不,它不是预加载器。是编译器在可执行文件中生成相同的字符数组。
【解决方案2】:

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

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

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

其实完全一样

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 其实他好像忽略了中间那个空格所以变成了{percent}{percent}{c},然后就很清楚会变成什么了。
    • 是的,这就是我在第一次编辑中试图传达的内容,但似乎没有成功:^\
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2018-10-04
    相关资源
    最近更新 更多