关于cin的缓存区影响效果

1. 当缓冲区中有残留数据时,cin函数会直接去读取这些残留数据而不会请求键盘输入。而且,回车符也会被存入输入缓冲区中。

int num{};
while(cin>>num)
    cout<<num<<endl;    

这意味着两个问题:

 (1)如果插入了非法字符,不能转化为int类型,那么将始终留在缓存区,阻塞正常输入。换行符‘ ’也是非法字符;

 (2)如果(变量获取的元素个数)少于(键盘输入字符数),如用ch获取字符串,可以实现逐一读取输入的字符;

2. 我习惯的清空缓存去方法

cin.ignore(100, '
'); // 把回车(包括回车)之前的所以字符从输入缓冲流中清除出去
cin.get(num).get() //每次输入顺便去掉回车

3. 实例:

从键盘输入数字存入数组,直接回车可以允许为空输入(C++ Primer Plus 6.7):

 1 #include <iostream>
 2 #include <cctype>
 3 
 4 using namespace std;
 5 
 6 int main() {
 7     const int DAY = 5;
 8 
 9     auto *fish = new unsigned int[DAY];
10     char temp = {};
11 
12     for (int day = 0; day < DAY; day++) {
13         cout << "请输入第" << day+1 << "天的战绩:";
14 
15         cin.get(temp).get();
16         cout << "从缓存去读取了ASCII:" << static_cast<int>(temp) << endl;
17 
18         
19         if (temp < '6' and isdigit(temp)) {
20             fish[day] = static_cast<unsigned int>(temp - 48);
21         }
22         else if (temp == 'q' or temp == '
') {
23 
24             continue;
25         }
26         else {
27             cout << "输入有误,退出系统
";
28             break;
29         }
30 
31     }
32 
33     cout << "显示结果:
";
34     for (int i = 0; i < DAY; i++) {
35         cout << "" << i+1 << "天的战绩:" << fish[i] << "";
36     }
37 }

程序说明:

程序逐一输入每一天的战绩,如果输入(1,2,3,4,5)中的一个,如果正确存入对应数组位置,直接回车或者输入‘q'跳过,输入无效字符推出程序。其中:

cin.get(temp).get()或者 在之后添加 cin.ignore(100, '
'),都可以实现清除缓存区,清除上一次输入对后一次的影响。
原文地址:https://www.cnblogs.com/geoffreyone/p/9836751.html