C++代码执行时getline输入被跳过的问题求解,附完整可复现代码示例
问题根因
- 执行
cin >> repeat读取整数时,输入流仅提取数值内容,用户输入结束按下的换行符\n会残留在输入缓冲区中。 getline默认以换行符作为读取终止标识,执行时会直接读取到残留的换行符,返回空字符串,表现为输入步骤被跳过。
修复方案
方案1:主动丢弃缓冲区残留的换行符
在cin >> repeat语句后新增一行cin.ignore(),主动消耗掉缓冲区残留的换行符即可。修改后对应代码片段如下:
cout << "Repititions? "; cin >> repeat; cin.ignore(); // 丢弃缓冲区中残留的换行符 cout << "Message? "; getline(cin, message);
如果需要更稳妥的处理,避免缓冲区存在其他多余残留字符,可以使用以下写法,清空缓冲区到换行符为止的所有内容,该写法需要额外引入<limits>头文件:
cin.ignore(numeric_limits<streamsize>::max(), '\n');
方案2:统一输入方式
避免混合使用cin >>格式化输入和getline行输入,所有输入统一使用getline读取后,再按需做数据类型转换,也可以彻底规避这类输入缓冲区残留导致的问题。
内容的提问来源于stack exchange,提问作者Bear
相关产品推荐
相关产品推荐

