多字符串输入时std::getline丢失首字符/无cin.ignore报下标越界问题
问题根因
两类异常均为std::cin缓冲区残留换行符和ignore()调用逻辑错误共同导致:
- 循环内每次调用
cin.ignore()的问题:首次循环时ignore()确实清掉了之前输入残留的换行符,但std::getline读取一行时会自动把末尾的换行符从缓冲区移除,后续循环再调用ignore()就会吞掉下一行输入的第一个字符,最终表现为第一个之后的所有字符串丢失首字符。 - 不调用
cin.ignore()的问题:首次执行getline时会直接读到缓冲区里残留的空换行,得到一个空字符串,后续如果直接按下标访问这个空字符串的元素,就会触发string subscript goes out of range下标越界错误。
修复方案
将cin.ignore()从循环体移到循环之前,仅调用一次清空残留换行即可,修正后代码如下:
#include <vector> #include <string> #include <iostream> // 如需使用更稳妥的清空方式要引入limits头文件 #include <limits> int main() { std::vector<std::string> input; // 仅在循环前调用一次,清空之前输入残留的换行符 // 稳妥写法:清空缓冲区内直到换行符的所有内容,避免残留多余字符 std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); for (int i = 0; i < 5; i++) { std::string lines; std::getline(std::cin, lines, '\n'); input.push_back(lines); } return 0; }
注意事项
如果这段输入逻辑之前没有使用std::cin >>读取过其他内容,缓冲区没有残留换行,完全不需要调用ignore(),直接执行getline即可。
内容的提问来源于stack exchange,提问作者Fayas Mohamed
相关产品推荐
相关产品推荐

