C++中用while循环和std::cin读取字符串与数值至向量的问题
解决Name_pairs类输入EOF后的输入恢复问题
问题本质
Linux下按下ctrl-D会触发标准输入的系统级EOF标记,仅调用cin.clear()只能清除C++流的错误状态位,无法重置系统层面的EOF标记,后续cin读取仍会直接返回EOF,导致年龄输入失败。
两种符合书中基础方法的解决方案
方案1:用约定终止符替代ctrl-D(推荐)
完全避免触发EOF,用一个指定字符串(比如"stop")结束名字输入,逻辑简单且符合书中的基础IO用法:
void read_names() { std::string name; std::cout << "输入名字(输入stop结束):\n"; while (std::cin >> name) { if (name == "stop") break; names.push_back(name); } }
方案2:清除系统级EOF标记(保留ctrl-D)
如果必须保留ctrl-D结束输入,可配合C标准库的clearerr(stdin)清除系统层面的EOF标记,再用cin.clear()重置流状态,需要包含头文件<cstdio>:
void read_ages() { std::cin.clear(); // 清除C++流的错误状态 clearerr(stdin); // 清除系统stdin的EOF标记 int age; std::cout << "输入对应年龄:\n"; for (size_t i = 0; i < names.size(); ++i) { std::cout << names[i] << "的年龄:"; std::cin >> age; ages.push_back(age); } }
额外验证逻辑
最后添加数量匹配检查,确保年龄和名字数量一致(符合书中的错误处理思路):
void read_ages() { // 上述读取逻辑... while (ages.size() != names.size()) { std::cout << "年龄数量与名字不匹配,请补充输入:\n"; int age; std::cin >> age; ages.push_back(age); } }
内容的提问来源于stack exchange,提问作者user24335519
相关产品推荐
相关产品推荐

