C++中std::cin.getline与输入流搭配使用异常问题咨询
#include<iostream> int main() { char s[20]; char ch; std::cin.getline(s,10); std::cout<<"x"<<s<<"x"<<"\n"; std::cin>>ch; std::cout<<"x"<<ch<<"x"; std::cin>>ch; std::cout<<"x"<<ch<<"x"; std::cin>>ch; std::cout<<"x"<<ch<<"x"; }
问题根本原因
std::cin.getline(char* str, std::streamsize count) 读取输入时,如果在读取到count-1个字符后仍未遇到换行符(默认分隔符),会触发两个操作:
- 将已读取的
count-1个字符写入目标数组,末尾追加\0 - 主动设置输入流的
failbit错误位,将整个输入流标记为失效状态
输入流一旦进入失效状态,后续所有输入操作(包括你代码里的三次std::cin>>ch)都会直接执行失败,不会读取输入缓冲区的残留内容,也不会触发等待用户键盘输入的逻辑,未被赋值的ch变量会输出随机垃圾值,就是你看到的x x效果。
两种场景差异说明
- 场景1(输入9个字符
bonaparte):输入字符数刚好等于count-1=9,按下回车后getline正好读取到换行符,符合正常结束条件,不会设置failbit,输入流保持可用,后续输入操作可以正常等待用户输入。 - 场景2(输入10个字符
bonaparte2):输入字符数超过count-1=9,触发failbit设置,输入流直接失效,后续三次>>操作全部跳过,不会读取缓冲区剩余的2和换行符。
修复方案
如果需要在getline读取超长后继续使用输入流,需要在getline执行后手动清除错误位,并清空缓冲区残留内容:
#include<iostream> // 引入std::numeric_limits所需头文件 #include<limits> int main() { char s[20]; char ch; std::cin.getline(s,10); std::cout<<"x"<<s<<"x"<<"\n"; // 新增两行修复代码 std::cin.clear(); // 清除输入流所有错误位 // 清空缓冲区所有残留字符直到遇到换行符,同时丢弃换行符 std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cin>>ch; std::cout<<"x"<<ch<<"x"; std::cin>>ch; std::cout<<"x"<<ch<<"x"; std::cin>>ch; std::cout<<"x"<<ch<<"x"; }
内容的提问来源于stack exchange,提问作者Forrest Gump
相关产品推荐
相关产品推荐

