gpt4 book ai didi

c - 为什么使用 C printf 格式 "0x"打印 0(零)时没有前导 "%#x"?

转载 作者:太空狗 更新时间:2023-10-29 16:23:30 30 4
gpt4 key购买 nike

背景:我有许多脚本可以解析日志文件,通过查找前导“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?

最佳答案

标准好像是这样写的:

  • %#x%#o 尝试保证可以使用 strtol 正确解析输出基数 = 0

  • 在这些情况下,# 标志会添加尽可能少的额外字符。例如,0 打印为 0,因为不需要添加额外的 0x。如果您指定最小字段宽度和 0 填充,这很有意义。

  • 如果您想始终添加 0x,您通常可以简单地编写类似 0x%x 的内容。因此,%#x 似乎在您确实想要对 0 进行特殊处理的那些特殊情况下有用。但是预0x 的 pending 不适用于默认字段宽度说明符,例如)0x%12x 由 0x 和十六进制数字之间的空格右对齐,这不太可能是什么在那种情况下想要。对于这种情况,需要使用 sprintf 进行额外的准备过程,因此像 "0x2ac2" 这样的十六进制字符串可以是空白,并用 printf( "%12s", hexstr); 这样的东西右对齐; 幸运的是,使用 0 而不是使用 printf( "0x%012x", hexstr); 之类的空格进行证明可以按预期为解析器生成有效的十六进制数字。

现在 %#x 的指定工作方式在孤立的情况下很有意义。像 %010x 这样的东西被指定工作的方式在孤立的情况下很有意义。您正在组合这两个修饰符,最终结果可以说是奇怪的。对于另一个应用程序,例如自动生成整洁的 C 代码来初始化表,使用 0, 而不是 0x0 不是问题。

但是没有必要把%#x%010x结合起来。你可以只写 0x%08x 来做你想做的事。

关于c - 为什么使用 C printf 格式 "0x"打印 0(零)时没有前导 "%#x"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8513169/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com