C++中cin读取char时为何会消耗输入缓冲区全部字符?
为什么输入"john"后程序会循环读取每个字符?
这事儿本质是C++的std::cin输入缓冲机制在搞事情,我给你一步步拆解清楚:
首先,当你运行程序输入john并按下回车时,整个输入内容(包括最后的换行符\n)会被一次性存入输入缓冲区,而不是只给程序传第一个字符就完事。
接下来看你的代码逻辑:每次循环里的cin >> answer,对于char类型来说,它的行为是:
- 先自动跳过缓冲区里的所有空白字符(空格、换行、制表符这些)
- 然后读取下一个非空白字符
所以流程是这样的:
- 第一次循环:
cin从缓冲区取出j,此时缓冲区还剩ohn\n,输出answer: j - 第二次循环:缓冲区里还有内容,
cin直接取出o,输出answer: o,不需要等你输入 - 第三次循环:取出
h,输出answer: h - 第四次循环:取出
n,输出answer: n,此时缓冲区只剩\n - 第五次循环:
cin跳过空白的\n,发现缓冲区空了,才会停下来显示Continue ?等你新输入
如果你想让程序每次循环都强制等待新的用户输入,而不是啃缓冲区的剩余内容,可以在每次读取char之后,清空缓冲区里剩下的所有内容,直到遇到换行符。比如修改代码:
#include <iostream> #include <limits> // 需要包含这个头文件使用numeric_limits using namespace std; bool question() { while (true) { cout << "Continue ?\n"; char answer = 0; cin >> answer; cout << "answer: " << answer << endl; // 清空缓冲区直到换行符,丢弃剩余内容 cin.ignore(numeric_limits<streamsize>::max(), '\n'); } return false; } int main () { cout << question() << endl; }
这样修改后,输入john回车,程序只会读取j,然后把剩下的ohn\n全部忽略,下一次循环就会直接等你新输入了。
你的原代码示例:
#include <iostream> using namespace std; bool question() { while (true) { cout << "Continue ?\n"; char answer = 0; cin >> answer; cout << "answer: " << answer << endl; } return false; } int main () { cout << question() << endl; }
程序输出:
Continue ? john answer: j Continue ? answer: o Continue ? answer: h Continue ? answer: n Continue ?
内容的提问来源于stack exchange,提问作者Eduardo
相关产品推荐
相关产品推荐

