如何解决C++选举统计程序中长姓名导致的输出对齐问题?
解决候选人姓名过长导致表格对齐问题的方案
你的问题根源在于使用制表符\t分隔列,制表符的固定宽度会在内容长度超过时引发列错位。改用setw()配合对齐控制符可彻底解决这个问题,以下是具体修改方案:
方法一:固定列宽(简单直接)
修改printTable()函数,用setw()给每一列设置固定宽度,同时对姓名列设置左对齐(符合阅读习惯):
void printTable() { // 计算总得票数以统计得票率 int totalvotes = 0; for (int i = 0; i < numofcandidates; i++) { totalvotes += candidatevotes[i]; } // 设置左对齐,后续输出默认左对齐 cout << left; // 输出表头,每列设置固定宽度 cout << setw(15) << "候选人" << setw(10) << "得票数" << setw(20) << "占总票数百分比" << endl; // 输出候选人数据 for (int i = 0; i < numofcandidates; i++) { cout << setw(15) << candidateName[i] << setw(10) << candidatevotes[i] << fixed << showpoint << setprecision(2) << setw(20) << (candidatevotes[i] / (double)totalvotes * 100) << endl; } // 输出总计行 cout << setw(15) << "总计" << setw(10) << totalvotes << endl; cout << endl; }
方法二:动态适配最长姓名(更灵活)
如果想让姓名列宽度自动适配最长的候选人姓名,避免空间浪费,可先计算最长姓名长度,再动态设置列宽:
void printTable() { // 计算总得票数以统计得票率 int totalvotes = 0; for (int i = 0; i < numofcandidates; i++) { totalvotes += candidatevotes[i]; } // 计算最长候选人姓名长度,加2作为边距 int maxNameLen = 0; for (int i = 0; i < numofcandidates; i++) { if (candidateName[i].size() > maxNameLen) { maxNameLen = candidateName[i].size(); } } maxNameLen += 2; // 增加边距,避免内容挤在一起 // 设置左对齐 cout << left; // 动态设置姓名列宽度 cout << setw(maxNameLen) << "候选人" << setw(10) << "得票数" << setw(20) << "占总票数百分比" << endl; // 输出候选人数据 for (int i = 0; i < numofcandidates; i++) { cout << setw(maxNameLen) << candidateName[i] << setw(10) << candidatevotes[i] << fixed << showpoint << setprecision(2) << setw(20) << (candidatevotes[i] / (double)totalvotes * 100) << endl; } // 输出总计行 cout << setw(maxNameLen) << "总计" << setw(10) << totalvotes << endl; cout << endl; }
关键说明
left:设置输出左对齐,默认是右对齐,姓名左对齐更符合阅读习惯,且能保证列的起始位置固定。setw(n):设置当前输出字段的最小宽度,内容长度超过时按实际长度显示,不足时用空格填充,确保每列对齐。- 两种方法都彻底替代了制表符
\t,避免了因内容长度变化导致的错位问题。
内容的提问来源于stack exchange,提问作者Joshua-Michael
相关产品推荐
相关产品推荐

