前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >清除 C/C++ 中的输入缓冲区

清除 C/C++ 中的输入缓冲区

作者头像
鲸落c
发布2023-05-23 09:23:35
8600
发布2023-05-23 09:23:35
举报
文章被收录于专栏:鲸落学习笔记鲸落学习笔记
theme: channing-cyan highlight: a11y-dark
小知识,大挑战!

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

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

在C 编程的情况下

代码语言:javascript
复制
// C 代码解释为什么不清除输入缓冲区会导致不希望的输出
#include<stdio.h>
int main()
{
    char str[80], ch;
    
    // 扫描来自用户的输入 -juejin 为例
    scanf("%s", str);
    
    // Scan character from user-
    // 'a' for example
    ch = getchar();
    
    // Printing character array,
    // prints “juejin”)
    printf("%s\n", str);
    
    // This does not print
    // character 'a'
    printf("%c", ch);
    
    return 0;
}

输入:

代码语言:javascript
复制
GeeksforGeeks
a

输出:

代码语言:javascript
复制
juejin
代码语言:javascript
复制
**在C++ 的情况下**

// C++ 代码解释为什么不清除输入缓冲区会导致不希望的输出
#include<iostream>
#include<vector>
using namespace std;

int main()
{
    int a;
    char ch[80];
    
    // 输入来自用户的输入 - 例如 4
    cin >> a;
    
    // 从用户获取输入 - 例如“juejin”
    cin.getline(ch,80);
    
    // 打印 4
    cout << a << endl;
    
    //打印字符串:这不打印字符串
    cout << ch << endl;
    
    return 0;
}

输入:  

代码语言:javascript
复制
4 
juejin

输出:  

代码语言:javascript
复制
4

在上面的两个代码中,输出都没有按需要打印。这样做的原因是一个被占用的缓冲区。“\n”字符留在缓冲区中并作为下一个输入读取。 如何解决? 在 C 的情况下: \  

  1. 使用“ while ((getchar()) != '\n'); ”  : 输入“while ((getchar()) != '\n');” 读取缓冲区字符直到结束并丢弃它们(包括换行符)并在“scanf()”语句清除输入缓冲区并允许在所需容器中输入后使用它。
代码语言:javascript
复制
// C 代码解释为什么添加“while ( (getchar()) != '\n');” 在“scanf()”语句刷新输入缓冲区之后
#include<stdio.h>

int main()
{
    char str[80], ch;
    
    // 扫描来自用户的输入 - 例如 juejin
    scanf("%s", str);
    
    // 刷新标准输入(清除输入缓冲区)
    while ((getchar()) != '\n');
    
    // 从用户扫描字符 - 例如'a'
    ch = getchar();
    
    // 打印字符数组,
    // 打印 “juejin”
    printf("%s\n", str);
    
    // 打印字符a:这次会打印'a'
    printf("%c", ch);

    return 0;
}

输入: 

代码语言:javascript
复制
juejin 
a

输出:   

代码语言:javascript
复制
juejin 
a

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

在 C++ 的情况下: \  

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

代码语言:javascript
复制
// C++代码解释如何“cin.ignore(numeric_limits <streamsize>::max(),'\n');” 丢弃输入缓冲区
#include<iostream>
#include<ios>	
#include<limits>
using namespace std;

int main()
{
    int a;
    char str[80];
    cin >> a;
    cin.ignore(numeric_limits<streamsize>::max(),'\n');
    cin.getline(str, 80);
    cout << a << endl;
    cout << str << endl;
    return 0;
}

输入:   

代码语言:javascript
复制
4 
juejin

输出:   

代码语言:javascript
复制
4 
juejin

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

代码语言:javascript
复制
// C++代码解释如何“cin.sync();” 丢弃输入缓冲区
#include<iostream>
#include<ios>	
#include<limits>
using namespace std;

int main()
{
    int a;
    char str[80];
    cin >> a;
    cin.sync();
    cin.getline(str, 80);
    cout << a << endl;
    cout << str << endl;
    return 0;
}

输入:   

代码语言:javascript
复制
4 
juejin

输出:   

代码语言:javascript
复制
4

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

代码语言:javascript
复制
// 解释“cin >> ws”如何丢弃输入缓冲区以及字符串的初始空格的 C++ 代码

#include<iostream>
#include<vector>
using namespace std;

int main()
{
    int a;
    string s;
    cin >> a;	
    cin >> ws;
    getline(cin, s);
    cout << a << endl;
    cout << s << endl;
    return 0;
}

输入:   

代码语言:javascript
复制
4 
juejin

输出:   

代码语言:javascript
复制
4 
juejin
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档