为何使用固定大小字符数组时std::cin.getline()会跳过第二次输入?
问题分析与解决
当你输入的字符串长度超过arrSize(20)时,std::cin.getline()会触发以下行为:
- 读取19个字符到
usrName数组(留一个位置存字符串结束符\0) - 此时输入缓冲区中还剩超出部分的字符和换行符,但
getline会设置流的failbit错误标志,表示输入操作失败
一旦流处于错误状态,后续所有输入操作(包括你调用的std::cin.ignore()和第二次getline)都会直接跳过,不会执行,这就是程序不让你输入甜点的原因。
修复方案
在处理缓冲区之前,先清除流的错误标志,再忽略剩余内容。修改后的代码如下:
#include <iostream> #include <limits> int main() { const short arrSize = 20; char usrName[arrSize]; char dessert[arrSize]; // First input: Name std::cout << "Enter your name: "; std::cin.getline(usrName, sizeof usrName); // 处理输入溢出:先清除错误标志,再忽略缓冲区剩余内容到换行 if (std::cin.fail()) { std::cin.clear(); // 清除流的错误状态 std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } // Debugging: Check what's in the buffer std::cout << "After ignore(), next character in buffer: '" << (char)std::cin.peek() << "'" << std::endl; std::cout << "What would you like to have for dessert?" << std::endl; std::cin.getline(dessert, sizeof dessert); // Second input (Dessert) std::cout << "Mr. " << usrName << ", here is your dessert: " << dessert << std::endl; return 0; }
关键说明
std::cin.clear():重置流的错误标志位,让流恢复正常工作状态,这样后续的ignore和getline才能执行。- 只有在确认流处于失败状态(
std::cin.fail()为真)时才需要执行清除和忽略操作,避免正常输入时误操作。
内容的提问来源于stack exchange,提问作者Abhishek Varma
相关产品推荐
相关产品推荐

