【问题标题】:Printing multiple instances of a number or a character by using format specifiers使用格式说明符打印数字或字符的多个实例
【发布时间】:2019-09-09 13:38:22
【问题描述】:

是否可以使用格式说明符打印多个数字?

printf("%05d",5);

这将打印 00005

有没有办法让它打印 ----5 例如使用这些格式说明符?

【问题讨论】:

  • 您要打印多个数字,还是要打印一个数字加上一些破折号?

标签: c printf format-specifiers


【解决方案1】:

如果你可以使用 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 } 就足够了。
  • 问题是关于为此使用 printf 的格式说明符,而不是手动构造字符串。
  • @Neowizard 啊,那你是对的。在这种情况下,我不知道是否可以仅使用格式说明符来完成。如果这个替代方案不是 OP 想要的,我会记下我的答案。谢谢指正
【解决方案2】:

你不能完全按照你的意愿去做。我认为最接近的是这样的:

#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 为底的位数,这涉及从 intdouble 的对数函数的隐式转换,然后返回到 intprintf 格式。这个对数只为正数定义(所以在这种情况下是整数 1 和更大),如果你想要 0 或负数支持,那么它们需要作为特殊情况处理(基本上是 3 分支 if-elseif-else 阶梯)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2013-05-19
    • 2014-06-22
    • 2015-12-31
    相关资源
    最近更新 更多