【问题标题】:Trailing Zeros in printf/sprintfprintf/sprintf 中的尾随零
【发布时间】:2011-11-25 10:21:12
【问题描述】:

我想让一个数字的输出总是有 6 位数字

例如:

  • 如果数字为 1,则输出应为 100000
  • 如果数字为 23,则输出应为 230000
  • 如果数字为 236,则输出应为 236000

如何使用printf/sprintf 做到这一点?

【问题讨论】:

    标签: c printf


    【解决方案1】:

    您不能直接使用 printf 进行操作(至少以符合标准的方式),您需要事先更改您的号码。

    【讨论】:

      【解决方案2】:

      printf 及其变体可以将零填充到左侧,而不是右侧。 sprintf 数字,然后自己添加必要的零,或确保数字长度为 6 位:

      while(num < 100000) 
          num *= 10;
      

      (此代码假定数字不是负数,否则您会遇到麻烦)

      【讨论】:

      • 这很容易解决:while ((num &lt; 1000000) and (num &gt; -1000000)),但更重要的是该数字必须是 32 位整数或更高,shortchar 不能保存这些类型的值。
      【解决方案3】:

      printf 将返回打印出来的字符数。这可以打印出剩余的零:

      int num = 3; // init
      int len = printf("%d", num);
      for (int i = 0; i < 6-len; ++i)
          printf("0");
      

      您应该添加一些错误检查(例如,如果len 大于 6)。

      使用sprintf,您可以在剩余的缓冲区上使用memset,这样会更容易。

      【讨论】:

      • 除了循环,你可以做if (len &gt;= 0 &amp;&amp; len &lt; 6) printf("000000" + len);
      【解决方案4】:

      使用printf的返回值(如下for循环的第一行)

      #include <stdio.h>
      
      int main(void) {
        int number, width = 6;
        for (number = 1; number < 9999999; number *= 7) {
          int digits = printf("%d", number);
          if (digits < width) printf("%0*d", width-digits, 0);
          puts("");
        }
        return 0;
      }
      

      查看在http://ideone.com/TolIv运行的代码

      【讨论】:

        【解决方案5】:

        正如 Luchian 所说,printf 不支持这种行为,这与更常见的反向(左)填充不同。 但是,您可以通过以下方式轻松生成请求的结果:

        char *number_to_six_digit_string(char *resulting_array, int number)
        {
            int current_length = sprintf(resulting_array, "%d", number);
            while (6 > current_length) {
                resulting_array[current_length++] = '0';
            }
            resulting_array[current_length] = '\0';
            return resulting_array;
        }
        

        然后你就可以打印结果了:

        char my_number[7];
        printf("my number is %s, other stuff\n", number_to_six_digit_string(my_number, 13));
        

        【讨论】:

          猜你喜欢
          • 2010-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-14
          • 2013-11-25
          • 2013-02-18
          相关资源
          最近更新 更多