【发布时间】:2019-09-09 13:38:22
【问题描述】:
是否可以使用格式说明符打印多个数字?
printf("%05d",5);
这将打印 00005
有没有办法让它打印 ----5 例如使用这些格式说明符?
【问题讨论】:
-
您要打印多个数字,还是要打印一个数字加上一些破折号?
标签: c printf format-specifiers
是否可以使用格式说明符打印多个数字?
printf("%05d",5);
这将打印 00005
有没有办法让它打印 ----5 例如使用这些格式说明符?
【问题讨论】:
标签: c printf format-specifiers
如果你可以使用 alloca,那么一个不太优雅的解决方案是:
printf("%s%d", (char*)memset(memset(alloca(4), '\0', 4), '-', 3),5);
如果你可以允许c++,那么你可以试试这个看起来更优雅一点:
printf("%s%d",std::string(3,'-').c_str(),5);
这两种情况都会给出---5
【讨论】:
alloca 捆绑在大多数标准 GCC 版本中,所以我相信我的答案是“是”
alloca,用固定大小调用alloca 完全没有意义。一个简单的组合字面量 (char[5]){ 0 } 就足够了。
你不能完全按照你的意愿去做。我认为最接近的是这样的:
#include <stdio.h>
#include <math.h>
// FILLER_DASH needs to be long enough for all use cases
const char *FILLER_DASH = "---------------------------------------------------";
int main(void) {
const int field_width = 10;
for (int number = 1 ; number < 1100000; number += (number + 90)) {
// zero or negative numbers not supported by this simple formula
int digits = log10(number) + 1;
printf("%.*s%d\n", field_width - digits, FILLER_DASH, number);
}
return 0;
}
它使用格式说明符中的* 从参数中获取字段宽度,然后使用字符串提供要打印的字符。
它使用以 10 为底的对数来获取数字中以 10 为底的位数,这涉及从 int 到 double 的对数函数的隐式转换,然后返回到 int 的 printf 格式。这个对数只为正数定义(所以在这种情况下是整数 1 和更大),如果你想要 0 或负数支持,那么它们需要作为特殊情况处理(基本上是 3 分支 if-elseif-else 阶梯)。
【讨论】: