• 在 C/C++ 中清除输入缓冲区


    什么是缓冲区? 
    临时存储区域称为缓冲区。所有标准输入和输出设备都包含一个输入和输出缓冲区。在标准 C/C++ 中,流是缓冲的,例如在标准输入的情况下,当我们按下键盘上的键时,它不会发送到您的程序,而是由操作系统缓冲直到分配时间到那个程序。

    它如何影响编程? 
    在各种情况下,您可能需要清除不需要的缓冲区,以便在所需容器中获取下一个输入,而不是在前一个变量的缓冲区中。比如C遇到“scanf()”后,需要输入字符数组或字符,C++遇到“cin”语句后,需要输入字符数组或字符。一个字符串,我们需要清除输入缓冲区,否则所需的输入被前一个变量的缓冲区占用,而不是被所需的容器占用。在第一次输入后在输出屏幕上按“Enter”(回车)时,由于前一个变量的缓冲区是新容器的空间(因为我们没有清除它),程序跳过以下输入容器。

    C 编程 的情况下

    1. // C 代码解释为什么不清除输入缓冲区会导致不希望的输出
    2. #include<stdio.h>
    3. int main()
    4. {
    5. char str[80], ch;
    6. // 例如,扫描来自用户 Serven 的输入
    7. scanf("%s", str);
    8. // 扫描来自用户 - 'a' 的字符,例如
    9. ch = getchar();
    10. // 打印字符数组,打印“Serven”)
    11. printf("%s\n", str);
    12. // 这不打印字符'a'
    13. printf("%c", ch);
    14. return 0;
    15. }

    输入:

    1. Serven
    2. a

     输出:

    Serven 

     C++的情况下 

    1. // C++ 代码解释为什么不清除输入缓冲区会导致不需要的输出
    2. #include<iostream>
    3. #include<vector>
    4. using namespace std;
    5. int main()
    6. {
    7. int a;
    8. char ch[80];
    9.   // 输入来自用户的输入,例如输入4
    10. cin >> a;
    11.  // 从用户那里获取输入 -例如“Serven”
    12. cin.getline(ch,80);
    13. // 打印 4
    14. cout << a << endl;
    15.   // 打印字符串:这将不会被打印出来
    16.   cout << ch << endl; 
    17. return 0;
    18. }

    输入:

    1. 4
    2. serven

    输出:

    4 

    在上述两个代码中,都没有按需要打印输出。原因是缓冲区被占用。“\n”字符将保留在缓冲区中,并作为下一个输入读取。

    如何解决?

     C 的情况下:  

    1. 使用“ while ((getchar()) != '\n'); ” : 输入“while ((getchar()) != '\n');” 读取缓冲区字符直到结束并丢弃它们(包括换行符)并在“scanf()”语句清除输入缓冲区并允许在所需容器中输入之后使用它。

    1. // C 代码解释为什么要添加“while ( (getchar()) != '\n');” 在“scanf()”语句刷新输入缓冲区之后
    2. #include<stdio.h>
    3. int main()
    4. {
    5. char str[80], ch;
    6. // 扫描用户输入 -
    7.   // 例如 Serven
    8. scanf("%s", str);
    9. //刷新标准输入
    10.   //(清除输入缓冲区)
    11. while ((getchar()) != '\n');
    12. // 扫描来自用户的字符 -
    13.   // 例如 'a'
    14.   ch = getchar();
    15. // 打印字符数组,
    16.   // 打印“Serven”)
    17. printf("%s\n", str);
    18. // 打印字符a:这次会打印'a'
    19. printf("%c", ch);
    20. return 0;
    21. }

    输入:​​​​​​​

    1. Serven
    2. a

    输出:​​​​​​​

    1. Serven
    2. a

    ​​​​​​​

    2. 使用“fflush(stdin)”:在“scanf()”语句之后键入“fflush(stdin)”也会清除输入缓冲区,但会避免使用它,并且根据 C 将输入流称为“未定义” ++11 标准。

     C++ 的情况下:  

    1. 使用“ cin.ignore(numeric_limits::max(),'\n'); ” :- 输入“cin.ignore(numeric_limits::max(),'\n');” 在“cin”语句之后丢弃输入流中的所有内容,包括换行符。 

    1. // C++ 代码解释如何“cin.ignore(numeric_limits <streamsize>::max(),'\n');” 丢弃输入缓冲区
    2. #include<iostream>
    3. // 对于<streamsize>
    4. #include<ios>
    5. // 对于 numeric_limits
    6. #include<limits>
    7. using namespace std;
    8. int main()
    9. {
    10. int a;
    11. char str[80];
    12. // 输入
    13.   //  4  
    14. cin >> a;
    15. // 丢弃输入缓冲区
    16. cin.ignore(numeric_limits<streamsize>::max(),'\n');
    17. // 输入
    18.   // 例如Serven
    19. cin.getline(str, 80);
    20.   // 打印 4 
    21. cout << a << endl;
    22.   // 字符串将会被打印
    23. cout << str << endl;
    24. return 0;
    25. }

    输入:​​​​​​​

    1. Serven

    输出: ​​​​​​​

    1. 4
    2. Serven

    2. 使用“cin.sync()”:在“cin”语句之后输入“cin.sync()”会丢弃缓冲区中剩余的所有内容。尽管“cin.sync()”在所有实现中都不起作用(根据 C++11 及以上标准)。

    1. // C++ 代码解释如何“cin.sync();”
    2. // 丢弃输入缓冲区
    3. #include<iostream>
    4. #include<ios>
    5. #include<limits>
    6. using namespace std;
    7. int main()
    8. {
    9. int a;
    10. char str[80];
    11. // 输入
    12.   // - 4  
    13. cin >> a;
    14. // 丢弃输入缓冲区
    15. cin.sync();
    16. // 输入
    17. // 例如Serven
    18. cin.getline(str, 80);
    19. // 打印 4
    20. cout << a << endl;
    21. // 打印字符串 - 现在将打印字符串
    22. cout << str << endl;
    23. return 0;
    24. }

    输入: ​​​​​​​

    1. 4
    2. Serven

    输出: 

    4

    3. 使用“cin >> ws”:在“cin”语句之后输入“cin>>ws”告诉编译器忽略缓冲区,并丢弃字符串或字符数组实际内容之前的所有空格。 ​​​​​​​

    1. // C++ 代码解释“cin >> ws”如何丢弃输入缓冲区以及字符串的初始空白
    2. #include<iostream>
    3. #include<vector>
    4. using namespace std;
    5. int main()
    6. {
    7. int a;
    8. string s;
    9.   // 输入 
    10. // 4
    11. cin >> a;
    12. // 丢弃字符串的输入缓冲区和初始空格
    13. cin >> ws;
    14. // 输入
    15.   // 例如 serven
    16. getline(cin, s);
    17.   // 打印 4和 serven
    18. cout << a << endl;
    19. cout << s << endl;
    20. return 0;
    21. }

    输入: ​​​​​​​

    1. 4
    2. Serven

    输出: ​​​​​​​

    1. 4
    2. Serven

  • 相关阅读:
    Spring事务执行原理源码
    【金融项目】尚融宝项目(十四)
    vue3(vite)+electron打包踩坑记录(1)
    设计模式之策略模式【内附通过工厂方法+枚举实现根据参数调用不同的策略】
    【Linux】CentOS8.4 安装docker
    基于springboot信用分析管理系统设计与实现。
    Java中传地址之后重新赋值String字符串也不会发生改变,因为String具有不可变性
    msvcp140.dll丢失的有哪些解决方法,丢失msvcp140.dll是什么意思
    跟单王订单追踪软件如何打通金蝶ERP?
    GPT 写作与改编
  • 原文地址:https://blog.csdn.net/weixin_43340455/article/details/125419966