【问题标题】:Formatting numbers in loop循环格式化数字
【发布时间】:2011-02-23 03:18:31
【问题描述】:

我想列出从 0000 到 9999 的所有数字,但是我无法保持零位。

我试过了:

for(int i = 0; i <= 9999; ++i)
{
cout << i << "\n";
}

但我得到:1,2,3,4..ect 我怎样才能使它成为0001,0002,0003....0010等

【问题讨论】:

    标签: c++ numbers generator string-formatting


    【解决方案1】:

    请参阅setfill 指定填充字符,setw 指定最小宽度。

    您的情况如下:

    for(int i = 0; i <= 9999; ++i)
    {
        cout << setfill('0') << setw(4) << i << "\n";
    }
    

    【讨论】:

    • @johnsyweb: 顺其自然 :)
    • 很好奇,为什么是“\n”而不是“endl”?
    • @ArunSaha std::endl() 是一个函数,其作用是返回一个换行符并刷新流。您可能希望也可能不希望刷新流。在大多数情况下,我们并不真正关心那个级别的事情,我们会在两者之间任意选择。但是如果我们不刷新,即如果我们使用'\n' 而不是std::endl,那么事情可能会更快一些。这是因为我们写入流的缓冲区而不是输出设备。通过写入缓冲区,我们延迟了写入输出设备。与写入内存中的缓冲区相比,写入 IO 设备的成本通常很高。
    • 所以作为一个指导原则,除非你真的希望某些东西出现在现在(例如,在调试崩溃时,因为延迟可能意味着它永远不会出现)最好让缓冲分摊写入 IO 设备的成本并使用\n
    • @wilhelmtell:感谢您的精彩解释。 @Mathieu:感谢您的简单指导。
    【解决方案2】:

    你只需要设置一些标志:

    #include <iostream>
    #include <iomanip>
    
    using namespace std;
    int main()
    {
        cout << setfill('0');
        for(int i = 999; i >= 0; --i)
        {
            cout << setw(4) << i << "\n";
        }
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      使用ios_base::width()ios::fill()

      cout.width(5);
      cout.fill('0');
      cout << i << endl;
      

      或者,使用 IO 操纵器:

      #include<iomanip>
      
      // ...
      cout << setw(5) << setfill('0') << i << endl;
      

      【讨论】:

      • 没有额外头文件的顶级方式能做到吗?
      【解决方案4】:

      虽然不是必需的,但如果你想知道如何用 C 来做到这一点,这里有一个例子:

      for (int i = 0; i <= 9999; i++)
          printf("%04d\n", i);
      

      在这里,“%04d”中的“0”的作用类似于setfill('0'),而“4”的作用类似于setw(4)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多