C++程序输入学习项目后无限返回选项菜单问题排查求助
输入学习项目后程序无限循环菜单的问题解决
问题根源
你遇到的无限循环确实是输入缓冲区残留换行符导致的,具体问题出在这段代码逻辑里:
cout << "Please enter your term of study e.g. 2020/24: "; cin >> data; outfile << data << "\t"; cout << "Please enter the Programme of study you are in: "; getline(cin, programme, '\n'); cin.ignore();
- 用
cin >> data读取学期信息时,输入完成按回车,这个换行符会留在输入缓冲区中 - 后续的
getline会直接读取这个残留的换行符,导致programme被设为空字符串,相当于直接跳过了学习项目的输入步骤 - 更糟的是你把
cin.ignore()放在了getline之后,这会吃掉下一个输入的字符,引发后续cin >> level的读取异常,最终导致程序逻辑混乱,菜单开始无限输出
修复方案
把cin.ignore()移到getline之前,同时去掉getline里多余的'\n'(getline默认就是以换行符为结束标志):
cout << "Please enter your term of study e.g. 2020/24: "; cin >> data; outfile << data << "\t"; // 先清除缓冲区里残留的换行符 cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << "Please enter the Programme of study you are in: "; getline(cin, programme); // 不需要额外指定'\n' outfile << programme << "\t";
注:使用numeric_limits需要包含头文件<limits>,如果不想添加该头文件,也可以用cin.ignore(1000, '\n'),用足够大的数字覆盖可能的残留字符
额外代码隐患提示
你代码里还有一个容易触发崩溃的问题:
int len = data.length(); while (len < 30) { data[len] = ' '; len = len + 1; }
直接通过data[len]赋值会导致字符串越界,因为string的长度不会自动扩展。应该改成用append方法填充空格:
int len = data.length(); if (len < 30) { data.append(30 - len, ' '); }
内容的提问来源于stack exchange,提问作者LGGawd
相关产品推荐
相关产品推荐

