使用setfill()与setw()时出现多余字符/空格,调用函数后输出异常
问题描述
我是一名学生,仅可使用教授讲授的setfill()、setw()、left、right工具实现框状界面打印,但遇到两个问题:
- 输出存在多余空格或字符,界面错位
- 调用函数返回后,第二次使用
setfill()和setw()的输出异常:原本期望输出|+ 80个-+|,实际变成||+ 80个-
尝试过调整endl位置、setw()与setfill()的顺序、添加left/right,均未解决问题。相关代码片段如下:
void charChoicesList(char& charChoice, householdList houseArray[], int countArray, householdList sortedArray[]) { do { cout << setw(50) << "[Please choose a category]" << endl; cout << "|" << setfill('-') << setw(80) << "|" << endl; cout << setfill(' '); cout << setw(80) << left << "|A. Print all Data" << "|\n" << setw(80) << left << "|B. List Identification code of households with income greater than the average" << "|\n" << setw(80) << left << "|C. Determine the percentage of households having an income below poverty level" << "|\n" << setw(80) << left << "|D. Print all Data sorted by household income" << "|\n" << setw(80) << left << "|E.Calculate and print the median household income" << "|\n" << setw(80) << left << "|F.Exit Program" << "|" << endl; cout << "|" << setfill('-') << setw(80) << "-" << "|" << endl; cout << setfill(' ') << endl; cin >> charChoice; switch (charChoice) { case 'a': case 'A': cout << "A. Print all Data\n" << endl; printData(houseArray, countArray); cout << endl; break; case 'b': case 'B': cout << "B. List Identification code of households with income greater than the average\n" << endl; calcAverageList(houseArray, countArray); cout << endl; break; case 'c': case 'C': cout << "C. Determine the percentage of households having an income below poverty level\n" << endl; povertyPercent(houseArray, countArray); cout << endl; break; case 'd': case 'D': cout << "D. Print all Data sorted by household income\n" << endl; printSorted(houseArray, countArray, sortedArray); cout << endl; break; case 'e': case 'E': cout << "E. Calculate and print the median household income\n" << endl; calculateMedian(houseArray, countArray, sortedArray); cout << endl; break; case 'f': case 'F': cout << "F. Exit Program\n" << endl; break; default: cout << "Input Error!\n" << endl; } } while (charChoice != 'f' && charChoice != 'F'); }
问题分析与解决
1. 边框与选项行的格式错误
- 顶部边框问题:原代码中
cout << "|" << setfill('-') << setw(80) << "|" << endl;是给"|"设置80宽度,默认右对齐,因此会填充79个-,最终输出|+79个-+|,不符合80个-的要求。应改为对空字符串设置80宽度,直接填充80个-:cout << "|" << setfill('-') << setw(80) << "" << "|" << endl; - 选项行错位问题:原代码把
|包含在setw(80)的作用范围内,导致总长度和边框不一致。正确写法是单独输出左侧|,用setw(80)控制中间内容的宽度(左对齐填充空格),最后输出右侧|,保证总长度和边框匹配:cout << "|" << left << setw(80) << "A. Print all Data" << "|" << endl;
2. 调用函数后格式异常问题
流的格式状态(如left/right、填充字符)是持久化的,若被调用的函数(如printData)修改了格式但未恢复,回到当前函数后会沿用修改后的状态,导致输出异常。解决办法:
- 在每个被调用的函数中,修改格式前保存原状态,修改后恢复;
- 或者在当前函数每次输出格式相关内容时,明确设置所需的格式(比如每次输出边框前确保对齐方式为默认的
right,或直接使用不依赖对齐的空字符串填充方式)。
修正后的代码
void charChoicesList(char& charChoice, householdList houseArray[], int countArray, householdList sortedArray[]) { do { // 居中显示标题,调整宽度适配82总长度的框 cout << setw(52) << "[Please choose a category]" << endl; // 顶部边框:| + 80个- + | cout << "|" << setfill('-') << setw(80) << "" << "|" << endl; cout << setfill(' '); // 选项行:左侧| + 80字符内容(左对齐填充空格) + 右侧| cout << "|" << left << setw(80) << "A. Print all Data" << "|" << endl << "|" << left << setw(80) << "B. List Identification code of households with income greater than the average" << "|" << endl << "|" << left << setw(80) << "C. Determine the percentage of households having an income below poverty level" << "|" << endl << "|" << left << setw(80) << "D. Print all Data sorted by household income" << "|" << endl << "|" << left << setw(80) << "E. Calculate and print the median household income" << "|" << endl << "|" << left << setw(80) << "F. Exit Program" << "|" << endl; // 底部边框:| + 80个- + | cout << "|" << setfill('-') << setw(80) << "" << "|" << endl; cout << setfill(' ') << endl; cin >> charChoice; switch (charChoice) { case 'a': case 'A': cout << "A. Print all Data\n" << endl; printData(houseArray, countArray); cout << endl; break; case 'b': case 'B': cout << "B. List Identification code of households with income greater than the average\n" << endl; calcAverageList(houseArray, countArray); cout << endl; break; case 'c': case 'C': cout << "C. Determine the percentage of households having an income below poverty level\n" << endl; povertyPercent(houseArray, countArray); cout << endl; break; case 'd': case 'D': cout << "D. Print all Data sorted by household income\n" << endl; printSorted(houseArray, countArray, sortedArray); cout << endl; break; case 'e': case 'E': cout << "E. Calculate and print the median household income\n" << endl; calculateMedian(houseArray, countArray, sortedArray); cout << endl; break; case 'f': case 'F': cout << "F. Exit Program\n" << endl; break; default: cout << "Input Error!\n" << endl; } } while (charChoice != 'f' && charChoice != 'F'); }
内容的提问来源于stack exchange,提问作者zeraphos
相关产品推荐
相关产品推荐

