C++使用iostream和iomanip实现表格数值右对齐、字符串左对齐
问题原因
- 语法错误:输出第二行数据时
setw(5缺少闭合右括号,导致输出逻辑异常 setw特性误用:setw仅对紧随其后的第一个输出项生效,你在对齐切换前设置的宽度对切换后的字符串输出无效- 宽度设置混乱:字符串列和第二列整数之间多余的
setw(5)会占用有效宽度,导致对齐错位 - 表头对齐不匹配:表头的
s列使用了右对齐,和内容列的左对齐要求不一致,导致表头和内容错位
正确实现代码
#include <iostream> #include <iomanip> using namespace std; class foo { public: int i; std::string s; int j; foo(int i1,std::string s1,int j1) : i(i1), s(s1),j(j1) {}; }; int main() { foo f1(1, "abc",50); foo f2(100, "abcde",60); // 定义列宽常量,方便后续统一调整 const int COL_I_WIDTH = 8, COL_S_WIDTH = 15, COL_J_WIDTH = 8; // 输出表头:i右对齐、s左对齐、j右对齐 cout << right << setw(COL_I_WIDTH) << "i" << left << setw(COL_S_WIDTH) << "s" << right << setw(COL_J_WIDTH) << "j" << endl; // 输出第一行数据 cout << right << setw(COL_I_WIDTH) << f1.i << left << setw(COL_S_WIDTH) << f1.s << right << setw(COL_J_WIDTH) << f1.j << endl; // 输出第二行数据 cout << right << setw(COL_I_WIDTH) << f2.i << left << setw(COL_S_WIDTH) << f2.s << right << setw(COL_J_WIDTH) << f2.j << endl; return 0; }
运行后输出完全符合预期:
i s j 1 abc 50 100 abcde 60
优化建议
- 优先使用
std::left/std::right操纵符替代手动操作ios::adjustfield,代码更简洁易读 - 将列宽定义为全局常量,后续调整表格格式时只需修改常量值,无需逐行修改硬编码的宽度数值
- 如果输出行数较多,可以封装单独的表格行输出函数,避免重复编写对齐、宽度设置代码
- 可以增加分隔线行提升表格可读性,例如输出表头后加一行
cout << string(COL_I_WIDTH + COL_S_WIDTH + COL_J_WIDTH, '-') << endl;生成横线分隔表头和内容
内容的提问来源于stack exchange,提问作者Finn
相关产品推荐
相关产品推荐

