如何重置do-while循环?我的姓名首字母提取代码重复执行异常
C++姓名首字母提取代码循环异常问题
我写了一段提取姓名首字母的C++代码:
using namespace std; int main() { char repeat; do { string str; cout << "What is your first and last name? " << endl; getline(cin, str); string findSpace = " "; int found = str.find(findSpace) + 1; cout << str[0] << str[found] << endl; cout << "repeat? " << endl; cin >> repeat; } while (repeat == 'y'); }
这段代码能正常提取姓名首字母,但触发循环重复操作时,会自动输出“What is your first and last name?”和“repeat?”,没法完整执行「询问姓名→输出首字母→询问是否重复」的流程,请问哪里出错了?
问题原因
问题出在cin >> repeat;读取输入后,输入缓冲区里残留了换行符。当循环进入下一轮时,getline(cin, str)会直接读取这个残留的换行符,导致str为空,程序直接跳过姓名输入步骤,继续执行后续逻辑,就出现了自动输出两次提示的情况。
解决方法
方式1:用cin.ignore()清空残留换行符
修改循环内读取repeat后的逻辑,加入缓冲区清理:
cout << "repeat? " << endl; cin >> repeat; // 忽略输入缓冲区中所有残留字符,直到处理掉换行符 cin.ignore(numeric_limits<streamsize>::max(), '\n');
注意需要在代码开头包含头文件<limits>,才能使用numeric_limits:
#include <limits>
方式2:用getline替代cin >>读取重复指令
把读取repeat的逻辑换成getline,从根源避免换行残留问题:
cout << "repeat? (y/n) " << endl; string repeatStr; getline(cin, repeatStr); // 处理空输入的情况,默认不重复 repeat = repeatStr.empty() ? 'n' : repeatStr[0];
额外优化:添加输入合法性判断
当前代码未处理用户输入不含空格的情况,此时str.find(findSpace)会返回string::npos,导致found值异常引发越界访问,建议补充判断:
size_t found = str.find(findSpace); if (found != string::npos) { cout << str[0] << str[found + 1] << endl; } else { cout << "请输入包含名和姓的完整姓名" << endl; }
(将int类型的found换成size_t更规范,因为string::find返回的是无符号整数类型)
内容的提问来源于stack exchange,提问作者Puggy
相关产品推荐
相关产品推荐

