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, ' '),都可以实现清除缓存区,清除上一次输入对后一次的影响。