c++ - C++ 格式化输出

标签 c++ formatting cout

我正在尝试使用 setwsetfill 函数,但我现在完全卡住了。这是我的代码:

char separator = ' ';

cout << "-" << setw(INET_ADDRSTRLEN*4 + INET6_ADDRSTRLEN) << setfill('-') << "\n";
cout << "| Name" << setw(INET_ADDRSTRLEN) << setfill(separator);
cout << "| IPv4" << setw(INET_ADDRSTRLEN) << setfill(separator);
cout << "| IPv6" << setw(INET6_ADDRSTRLEN) << setfill(separator);
cout << "| Netmask" << setw(INET_ADDRSTRLEN) << setfill(separator);
cout << "| Broadcast" << setw(INET_ADDRSTRLEN) << setfill(separator);
cout << "|\n";
cout << "-" << setw(INET_ADDRSTRLEN*4 + INET6_ADDRSTRLEN) << setfill('-') << "\n";

while (iter != this->iface.end()) {
    cout << "| " << (*iter).iface_name << setw(INET_ADDRSTRLEN) << setfill(separator);
    cout << "| " << (*iter).ipv4 << setw(INET_ADDRSTRLEN) << setfill(separator);
    cout << "| " << (*iter).ipv6 << setw(INET6_ADDRSTRLEN) << setfill(separator);
    cout << "| " << (*iter).netmask << setw(INET_ADDRSTRLEN) << setfill(separator);
    cout << "| " << (*iter).broadcast << setw(INET_ADDRSTRLEN) << setfill(separator);
    cout << "|\n";
    iter++;
}

这是我的输出。如何修复列的对齐方式?

--------------------------------------------------------------------------------------------------------------
| Name          | IPv4          | IPv6                                     | Netmask     | Broadcast              |
--------------------------------------------------------------------------------------------------------------
| lo              | 127.0.0.1              | ::1                                            | 255.0.0.0              | 127.0.0.1              |
| eth0              | 192.168.1.100              | fe80::2ad2:44ff:fe39:f798                                            | 255.255.255.0              | 192.168.1.255              |
| wlan0              | 192.168.1.103              | fe80::e8b:fdff:fe7c:bf5                                            | 255.255.255.0              | 192.168.1.255              |

最佳答案

你想左对齐你的填充字段,它会更容易推理(参见 std::left ):

std::cout << std::setw(INET_ADDRSTRLEN) << std::left << iter->iface_name
          << "| " 
          << std::setw(INET_ADDRSTRLEN) << std::left << iter->ipv4
          << "| "
          << std::setw(INET6_ADDRSTRLEN) << std::left << iter->ipv6
          // etc.

照原样,您的列不是基于您的字符串长度,而是基于它们后面的空格 - 从逻辑上讲,这不是恒定宽度。

关于c++ - C++ 格式化输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28181382/

相关文章:

其他库中类型之间的 C++ 转换运算符

c - C 中数组的输出不会格式化?

javascript - 我怎样才能在javascript中循环这个模式?

c++ - 有没有一种方法可以在不使用命名空间 std 或以 std::为前缀的情况下引用 cout?

c++ - 在堆上定义内置类型

c++ - 从文件中读取多个字节并存储它们以便在 C++ 中进行比较

C++ glibc 检测到损坏的双链表错误 C++

xml - Eclipse:如何格式化工作区中的所有 xml 文件?

C++、cout 和 UTF-8

c++ - 在 C++ 中使用 scanf() 和 printf() 的意外输出