【问题标题】:C++ setw() not working as expectedC++ setw() 没有按预期工作
【发布时间】:2016-09-27 08:24:01
【问题描述】:

我需要在控制台上打印一些数据。我的代码是:

cout << setw(5) << left << "id" << " | " << setw(10) << left << "computer" << " | " << setw(11) << left << "subsystem" << " | " <<
        setw(8) << left << "number" << " | " << setw(80) << left << "name" << " | " << setw(13) << left << "config_file" << endl;
    for (int i = 0; i < rows; i++)
        {
        cout << setw(5) << left << subsystem_table_data[i].id << " | " << setw(10) << left << subsystem_table_data[i].computer << " | " <<
                setw(11) << left << subsystem_table_data[i].subsystem << " | " << setw(8) << left << subsystem_table_data[i].number << " | " <<
                setw(80) << left << subsystem_table_data[i].name << " | " << setw(13) << left << subsystem_table_data[i].config_file << endl;
        }

输出(向右滚动查看):

id    | computer   | subsystem   | number   | name                                                                             | config_file  
1     | 1          | 2           | 0        | Computer 1 - Общая компьютерная платформа - 1          | 1            
2     | 1          | 1           | 0        | Computer 1 - Launcher - 1                                                        | 2            
3     | 1          | 23          | 0        | Computer 1 - Дисплей - 1                                                  | 3            
4     | 1          | 11          | 0        | Computer 1 - Контроллер цифровой - 1                           | 4            
5     | 1          | 21          | 0        | Computer 1 - Отладки - 1                                                  | 5            
6     | 2          | 2           | 0        | Computer 2 - Общая компьютерная платформа - 1          | 6            
7     | 2          | 1           | 0        | Computer 2 - Launcher - 1                                                        | 7            
8     | 2          | 23          | 0        | Computer 2 - Дисплей - 1                                                  | 8          

预期输出(再次在右侧):

id    | computer   | subsystem   | number   | name                                                                             | config_file  
1     | 1          | 2           | 0        | Computer 1 - Общая компьютерная платформа - 1                                    | 1            
2     | 1          | 1           | 0        | Computer 1 - Launcher - 1                                                        | 2            
3     | 1          | 23          | 0        | Computer 1 - Дисплей - 1                                                         | 3            
4     | 1          | 11          | 0        | Computer 1 - Контроллер цифровой - 1                                             | 4            
5     | 1          | 21          | 0        | Computer 1 - Отладки - 1                                                         | 5            
6     | 2          | 2           | 0        | Computer 2 - Общая компьютерная платформа - 1                                    | 6            
7     | 2          | 1           | 0        | Computer 2 - Launcher - 1                                                        | 7            
8     | 2          | 23          | 0        | Computer 2 - Дисплей - 1                                                         | 8             

我建议setw(80) &lt;&lt; left &lt;&lt; subsystem_table_data[i].name 代码部分有问题,但似乎找不到问题。据我所知,这不是因为总控制台宽度,因为第一行打印得很好。

【问题讨论】:

    标签: c++ setw


    【解决方案1】:

    setw() 按设计工作。它将输出填充到给定数量的 bytes1.

    问题是你不需要字节数,你需要文本宽度,但除非你的文本是纯 ASCII 并用等宽字体打印,否则这两件事是不同的。

    差异体现在几个层面:

    1. ASCII 范围以上的 Unicode 代码点被编码为多个字节(假设为 UTF-8;从各行占用的字节数来看,输出看起来是 UTF-8 格式)。
    2. 多个代码点可以组合成一个字形。如果您使用组合范式,这是除 MacOS 文件系统之外的标准,所有西里尔字形都是单个代码点,但在分解形式中,'й' 将是两个。
    3. 字形可能采用不同的屏幕宽度。

    第一点是导致您的错位的原因,如果分解的字符可能出现在您的输入中,则可能与第二点相结合。只要您使用等宽字体输出,西里尔字母就不会担心第三种字体,但如果您有可能遇到一些中文/日文/韩文文本,请记住它们的字形大多是“全角”和在大多数终端上,它们占用两个拉丁或西里尔字母的空格。

    C++ 标准库不支持计数字形。您需要使用 unicode 支持库(如 ICU)并自己处理对齐方式,或者采取简单的方法将文本列放在最后,这样结束就无关紧要了。


    1operator<<(std::ostream&, std::string const&) 的文档以std::string::size() 的形式描述了width() 的效果,这绝对是字节。

    【讨论】:

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