为何C++程序中用户输入的不同科目名打印时重复显示最后一个?
问题:成绩单科目名称全部显示为最后输入的科目
编写C++程序获取用户输入的科目名称及分数以生成成绩单,目前程序其他功能正常,但最终打印成绩单时,所有科目均显示最后输入的科目名称。例如输入Physics(80分)和Chemistry(70分)后,成绩单所有行都显示Chemistry,对应不同分数,已卡在此问题3小时,请求帮助。
原代码
#include <iostream> using namespace std; int main() { string fname, lname; int subjects; float totalMarks; cout << "Enter your first name: "; cin >> fname; cout << "Enter your last name: "; cin >> lname; cout << "Enter total marks: "; cin >> totalMarks; cout << "Marks of how many subjects: "; cin >> subjects; float subjectMarks[subjects]; string subjectNames[subjects]; for (int i = 0; i < subjects; i++) { for (int j = 0; j < subjects; j++) { cout << "Enter name of subject: "; cin >> subjectNames[j]; break; // I've used 'break' to exit the inner loop and go to outer loop for // entering the marks obtained in the subject }; cout << "Enter marks obtained in the subject: "; cin >> subjectMarks[i]; }; cout << "Dear, " << fname << " " << lname << "! The subjects and their marks are shown below: \n"; cout << "RESULTS IN SUBJECTS\n\n"; for (int i = 0; i < subjects; i++) { for (int j = 0; j < subjects; j++) { cout << subjectNames[j] << "\t\t"; break; } cout << subjectMarks[i] << endl; }; return 0; }
问题分析
你的代码核心错误在于多余的内层循环导致数组下标使用错误:
- 输入科目名称时,外层循环
i遍历每个科目,但内层循环每次都从j=0开始,把输入的科目名称赋值给subjectNames[0],后续输入的科目会不断覆盖这个位置的值,最终subjectNames[0]存储的是最后一个输入的科目名称。 - 打印成绩单时,同样用了内层循环只取
subjectNames[0]的值,所以所有行都显示最后输入的科目名称。
修正后的代码
去掉不必要的内层循环,直接用外层循环的i作为数组下标,对应每个科目的名称和分数:
#include <iostream> using namespace std; int main() { string fname, lname; int subjects; float totalMarks; cout << "Enter your first name: "; cin >> fname; cout << "Enter your last name: "; cin >> lname; cout << "Enter total marks: "; cin >> totalMarks; cout << "Marks of how many subjects: "; cin >> subjects; // 注意:C++标准不支持变长数组(VLA),如果需要可移植性,建议用vector替代 float subjectMarks[subjects]; string subjectNames[subjects]; for (int i = 0; i < subjects; i++) { cout << "Enter name of subject: "; cin >> subjectNames[i]; // 直接用i作为下标,存储到对应位置 cout << "Enter marks obtained in the subject: "; cin >> subjectMarks[i]; } cout << "Dear, " << fname << " " << lname << "! The subjects and their marks are shown below: \n"; cout << "RESULTS IN SUBJECTS\n\n"; for (int i = 0; i < subjects; i++) { cout << subjectNames[i] << "\t\t" << subjectMarks[i] << endl; // 直接用i对应科目和分数 } return 0; }
额外提示
C++标准中并不支持变长数组(即float subjectMarks[subjects]这种用变量定义数组大小的写法),虽然部分编译器(如GCC)支持作为扩展,但为了代码的可移植性,建议使用std::vector替代:
#include <vector> // ... vector<float> subjectMarks(subjects); vector<string> subjectNames(subjects);
内容的提问来源于stack exchange,提问作者Muhammad Hasnain Awan
相关产品推荐
相关产品推荐

