C++姓名排序程序无法接收输入,请求错误排查
代码错误分析与修正
存在的错误点
- vector未初始化空间:创建
vector<string> strArray;时容器为空,没有任何元素,直接用strArray[c]访问会触发数组越界,这是程序异常的核心原因。 - 循环次数错误:
for (int c = 0; c <= i; ++c)会执行i+1次循环,但实际只需要输入i个姓名,应改为c < i。 - 输出逻辑错误:排序后仅输出
strArray[0]和strArray[i],但strArray[i]属于越界访问(vector下标范围是0到i-1),且未遍历输出所有排序后的姓名。 - 错误提示位置错误:无论输入的
i是否合法,都会输出<Error wrong class size>,应将这段提示放在else分支中,仅当i不满足0 < i <26时显示。
修正后的代码
#include <algorithm> #include <vector> #include <string> #include <iostream> using namespace std; int main () { int i; cout << "How many students:" << endl; cin >> i; if (i > 0 && i < 26) { vector<string> strArray; // 预留空间优化性能,也可直接使用push_back strArray.reserve(i); for (int c = 0; c < i; ++c) { cout << "Name: "; string name; cin >> name; strArray.push_back(name); } sort(strArray.begin(), strArray.end()); cout << "Sorted names:" << endl; for (const string& name : strArray) { cout << name << endl; } } else { cout << "<Error wrong class size>"; } return 0; }
关键修正说明
- 使用
push_back向vector添加元素,无需提前分配空间(也可通过strArray.resize(i)初始化空间后用下标赋值,但push_back更安全)。 - 修正循环条件为
c < i,确保仅输入i个姓名。 - 用范围for循环遍历输出所有排序后的姓名,彻底避免下标越界问题。
- 将错误提示移至
else分支,仅在班级人数输入不合法时触发。
内容的提问来源于stack exchange,提问作者ThisIsMyUsername
相关产品推荐
相关产品推荐

