C++读取单个字符后后续整数输入被跳过问题求解
问题原因
- 核心问题是C++标准输入缓冲区的残留内容+cin输入失败状态未清理导致的:
- 你在控制台输入
Kevin后按下回车,此时输入缓冲区的内容为:Kevin\n(换行符) - 执行
cin >> Letter时,仅读取了第一个字符K存入变量,剩余的evin\n全部留在输入缓冲区中 - 后续执行
cin >> input尝试读取整数时,缓冲区第一个字符是字母e,不符合int类型的输入要求,cin直接进入失败状态,后续所有cin输入操作都会直接跳过,input变量保持初始化的0值,最终相乘结果为0
- 你在控制台输入
修复方案
你可以在Variable函数读取首字母后,清理掉输入缓冲区的所有残留内容即可,示例修改代码如下:
#include <iostream> #include <limits> // 引入清理缓冲区需要的头文件 using namespace std; int Variable() { char Letter= ' '; cout << "Your Name: "; cin >> Letter; cout << "Your first Letter is : " << Letter << endl; // 新增:清理输入缓冲区所有残留内容,直到碰到换行符为止 cin.ignore(numeric_limits<streamsize>::max(), '\n'); return 0; } int userInput(int number) { int input = 0; cout << "Give me your " << number << ". number: "; cin >> input; // 每次读取整数后也清理缓冲区,避免后续输入受多余字符影响 cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << "\n"; return input; } int main() { Variable(); int input1 = 0, input2 = 0; input1 = userInput(1); input2 = userInput(2); cout << "Result: " << (input1 * input2) << "\n\n"; return 0; }
如果之前已经触发了cin的失败状态,还可以先调用cin.clear()重置cin的状态标识,再执行缓冲区清理操作即可恢复正常输入。
内容的提问来源于stack exchange,提问作者Skaltag
相关产品推荐
相关产品推荐

