• 关于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, '
    '),都可以实现清除缓存区,清除上一次输入对后一次的影响。
  • 相关阅读:
    Android 通过solid来定义不同边框的颜色,可以只定义一个边框的颜色
    Java里的简单替换
    ActionBar
    char、short、int、float、double对应字节
    Java和JDK版本的关系-(转载)
    JFlash ARM对stm32程序的读取和烧录-(转载)
    STM32的时钟系统RCC详细整理(转载)
    STM32F7系列时钟相关问题:HSE模式配置(旁路模式、非旁路模式
    git OpenSSL SSL_connect问题
    keil使用VScode外部编辑器
  • 原文地址:https://www.cnblogs.com/geoffreyone/p/9836751.html
Copyright © 2020-2023  润新知