C++中cin读取输入异常求助:第二次cin被跳过
问题根源
- 用Ctrl+Z结束输入时,
cin会触发EOF(文件结束)状态,此时cin的错误标志位被激活,后续所有cin操作都会直接跳过,不会等待输入。 - 你在循环里加的
cin.ignore()完全多余:cin >> input本身会自动跳过所有空白字符(空格、换行、制表符),这个ignore会吃掉下一个输入的字符,导致部分单词被截断。
修复步骤
- 删掉循环内的
cin.ignore():保留cin >> input的默认行为即可,它会自动处理空白分隔。 - 重置cin的状态并清理缓冲区:在第一个循环结束后,先调用
cin.clear()清除错误标志位,再用cin.ignore(numeric_limits<streamsize>::max(), '\n')清空缓冲区里残留的字符(需要包含<limits>头文件)。 - 移除循环后多余的
cin.ignore():这个操作在cin状态未重置时完全无效,没必要保留。
修复后的完整代码
#include <iostream> #include <vector> #include <string> #include <limits> // 必须包含该头文件才能使用numeric_limits using namespace std; int main() { vector<string> words; cout << "Enter your words" << endl; // 移除循环内多余的cin.ignore() for (string input; cin >> input;) { words.push_back(input); } cout << "You entered these words:" << endl; for (string a : words) { cout << a << endl; } // 重置cin错误状态并清空缓冲区 cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); string disliked; cout << "If you have any disliked word please type it " << endl; cin >> disliked; for (int i = 0; i < words.size(); i++) { if (words[i] == disliked) { words[i] = "Bleep"; } } // 新增输出修改后的结果,方便验证 cout << "\nAfter replacing disliked word:" << endl; for (string a : words) { cout << a << endl; } return 0; }
补充说明
cin.clear():仅清除cin的错误标志位,不会清空输入缓冲区,必须配合ignore使用才能彻底清理残留内容。cin.ignore(numeric_limits<streamsize>::max(), '\n'):表示忽略从当前位置到换行符的所有字符,确保缓冲区干净,避免影响后续输入操作。- Linux/macOS系统用Ctrl+D结束输入,Windows用Ctrl+Z,两者效果一致。
内容的提问来源于stack exchange,提问作者nasiam
相关产品推荐
相关产品推荐

