You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 01:20:38