【问题标题】:C printf : conditional format depending on the base of an int valueC printf : 条件格式取决于 int 值的基数
【发布时间】:2020-03-16 10:29:49
【问题描述】:

我有一个无符号整数变量 x,它的值介于 0 和 0xFFFFF 之间,我想以一种对用户更易读的方式打印它。
如果 x 大于 0xF000,则以十六进制打印,否则以十进制打印。 所以像这样的事情就可以了

if (x > 0xF000) 
   printf("%#x", x);
else 
   printf("%u", x)

但我想知道是否有更方便和更智能的方法来处理这个问题,例如根据值设置输出的条件格式。

【问题讨论】:

  • 你所拥有的可能是最容易阅读的。除非有充分的理由让事情复杂化,否则我会停在这里。
  • 如果您的程序的输出曾经被机器或外行人读取,那么变化的表示可能会非常混乱。如果你真的想这样做,我强烈建议以某种方式标记输出格式,也许通过在十六进制数字前加上 0x,你可以使用 "0x%x""%#x"
  • 除了提到的其他问题之外,使用不是单个常量字符串的格式调用printf 可以说是糟糕的风格。一些风格指南不推荐它。我相信它是由一些编译器诊断出来的。这意味着编译器通常不能对格式字符串和参数之间的不匹配进行任何检查。
  • 另见Why is printf with a single argument (without conversion specifiers) deprecated?(虽然这是一个有些不同的问题)。

标签: c formatting printf


【解决方案1】:

您的“条件格式”可以使用三元“?”来指定运算符,如 cmets 中所建议的:

printf((x > 0xF000) ? "%#x" : "%u", x);

但是,正如 cmets 中所建议的那样,这在可读性方面并没有真正的帮助。

您还可以使用 字符串变量 作为格式参数,例如(在这种简单的情况下):

char fmt[4];
if (x > 0xF000) strcpy(fmt, "%x");
else            strcpy(fmt, "%u"); // You haven't specified what type "x" is, so let's assume "unsigned".
printf(fmt, x);

【讨论】:

  • 第二种方法不好,以防您想添加换行符或其他内容。
  • @machine_1 - 好吧,假设你让fmt 成为一个足够大的缓冲区,你可以把任何你想要的东西(包括换行符)放进去。但我并不是说这是最好的方式——只是一种方式。
  • 在第二个示例中,3 大小的缓冲区不够吗?
  • @AnttiHaapala 当然,同样可以使用char* fmt 并初始化为字符串文字。
  • @Mahouk 你应该发布一个单独的问题!并且在你的标题中非常具体明确。这里有很多人比我更“了解”这些方法。
猜你喜欢
  • 2014-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-09
相关资源
最近更新 更多