【发布时间】:2012-01-20 17:46:10
【问题描述】:
背景:我有许多脚本通过查找前导“0x”来解析日志文件以查找十六进制数字。我们的嵌入式 C 库更改为新的 printf。新的 printf 比我们以前的标准更符合标准,而且我的脚本坏了。
在 Linux 机器上:
#include <stdio.h>
int main( void )
{
printf( "%#010x\n", 0 );
printf( "%#010x\n", 1 );
return 0;
}
输出(使用 glibc)是:
0000000000
0x00000001
我们固件的输出是:
0x00000000
0x00000001
从 printf(3) 开始,在 '#' 标志字符上: “对于 x 和 X 转换,非零结果的前面带有字符串“0x”(或 X 转换的“0X”)。”
我很好奇为什么。无需深入研究 C 标准文档或为标准委员会成员买午餐,为什么不在零值参数上领先 0x?
【问题讨论】:
-
胡乱猜测:0 是 0 与基数无关,因此无需指定。
-
值得注意的是,您可以通过编写
"0x%08x"来获得 always 的行为,包括前导0x,而标准描述的行为将更难以获得一个总是包含前导0x的库。也许标准委员会正在针对更难获得的情况进行优化,而不是针对绝对最常见的情况? (当然,您不能将"%#10x"更改为"0x%8x",但是很难想象有人希望看到没有零填充的0x0。) -
C89 Rationale (HTML) 或 C99 Rationale (PDF) 中没有提及这一点。