笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。

CSDN视频网址:http://edu.csdn.net/lecturer/144

什么是缓冲区?

临时存储区称为缓冲区,所有标准输入和输出设备都包含输入和输出缓冲器。在标准C / C ++中,流是缓冲的,例如在标准输入的情况下,

当我们按键盘上的键时,它不会发送到您的程序,而是由操作系统缓冲,直到时间被分配给程序。

它如何影响编程?

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

C编程的情况下

#include<stdio.h>
int main()
{
    char str[80], ch;

    // Scan input from user -TestGame for example
    scanf("%s", str);

    // Scan character from user- 'a' for example
    ch = getchar();

    // Printing character array, prints “TestGame”)
    printf("%s\n", str);

    // This does not print character 'a'
    printf("%c", ch);

    return 0;
}

输入:

TestGame

一个

输出:

TestGame

C ++的情况下

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    int a;
    char ch[80];

    // Enter input from user - 4 for example
    cin >> a;

    // Get input from user - "TestGame" for example
    cin.getline(ch,80);

    // Prints 4
    cout << a << endl;

    // Printing string : This does not print string
    cout << ch << endl;

    return 0;
}

输入:

4
TestGame

输出:

4

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

如何解决?

在C:

1、使用“while((getchar())!='\ n'); “(键入)while((getchar())!='\ n');”读缓冲区字符直到结束并丢弃它们(包括换行符),

并在“scanf()”语句清除输入缓冲区之后使用它允许输入到所需的容器中。

#include<stdio.h>
int main()
{
    char str[80], ch;

    // scan input from user - TestGame for example
    scanf("%s", str);

    // flushes the standard input (clears the input buffer)
    while ((getchar()) != '\n');
     
    // scan character from user - 'a' for example
    ch = getchar();

    // Printing character array, prints “TestGame”)
    printf("%s\n", str);

    // Printing character a: It will print 'a' this time
    printf("%c", ch);

    return 0;
}

输入:

TestGame
一个

输出:

TestGame
一个

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

在C ++的情况下:

1、使用“cin.ignore(numeric_limits :: max(),'\ n'); “: - 在”cin“语句之后输入”cin.ignore(numeric_limits :: max(),'\ n');“后,放弃包含换行符的输入流中的所有内容。
#include<iostream>
#include<ios>     // for <streamsize>
#include<limits>  // for numeric_limits
using namespace std;
int main()
{
    int a;
    char str[80];

    // Enter input from user - 4 for example
    cin >> a;

    // discards the input buffer
    cin.ignore(numeric_limits<streamsize>::max(),'\n');

    // Get input from user - TestGame for example
    cin.getline(str, 80);

    // Prints 4
    cout << a << endl;

    // Printing string : This will print string now
    cout << str << endl;

    return 0;
}

输入:

4
TestGame

输出:

4
TestGame

2、使用“cin.sync()”:在“cin”语句之后键入“cin.sync()”将放弃缓冲区中的所有内容。虽然“cin.sync()” 不工作在所有实施(根据C ++ 11和上述标准)。

#include<iostream>
#include<ios>
#include<limits>
using namespace std;
int main()
{
    int a;
    char str[80];

    // Enter input from user - 4 for example
    cin >> a;

    // Discards the input buffer
    cin.sync();

    // Get input from user - TestGame for example
    cin.getline(str, 80);

    // Prints 4
    cout << a << endl;

    // Printing string - this will print string now
    cout << str << endl;

    return 0;
}

输入:

4
TestGame

输出:

4
TestGame

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

在C / C ++中清除输入缓冲区的更多相关文章

  1. scanf()中清除输入缓冲区的几种方法归纳

    应用场景:我们使用多个scanf()的时候,如果输入缓冲区还有数据的话,那么scanf()就不会询问用户输入,而是直接就将输入缓冲区的内容拿出来用了,这就导致了前面的错误影响到后面的内容,为了隔离这种 ...

  2. c++清除输入缓冲区之 sync() vs ignore()

    最近在写程序的时候总是不注意输入缓冲区内是否还有东西,导致出现了一些异常,调试了半天.所以来上一贴,学习注意,引以为戒! http://blog.chinaunix.net/uid-21254310- ...

  3. c++中清空输入缓冲区的方法(做cf的时候炸了)

    C/C++ 四种清空输入缓冲区的方法 比较实用的一种 char c; while(c=getchar()!='\n'); 或者是这种 cin.ignore(count,c); count代表要清除的字 ...

  4. C语言清空输入缓冲区的N种方法对比

    转自C语言清空输入缓冲区的N种方法对比 C语言中有几个基本输入函数: //获取字符系列 int fgetc(FILE *stream); int getc(FILE *stream); int get ...

  5. C语言清空输入缓冲区的N种方法对比【转】

    转自:http://www.cnblogs.com/codingmylife/archive/2010/04/18/1714954.html C语言中有几个基本输入函数: //获取字符系列 int f ...

  6. [转][修]C清空输入缓冲区

    为何要清空输入缓存区     读取时输入缓冲区中的内容会被scanf函数逐个取走,正常case下scanf()函数可以根据返回值判断成功取走的数目:但当发生读取异常之后,输入缓冲区中的内容并未被取走, ...

  7. C语言清空输入缓冲区的N种方法对比(转)

    C语言中有几个基本输入函数: //获取字符系列 int fgetc(FILE *stream); int getc(FILE *stream); int getchar(void); //获取行系列 ...

  8. C 清空输入缓冲区,以及fflush(stdin)的使用误区和解决方法

    转载:https://blog.csdn.net/Veniversum/article/details/62048870 对C 语言初学者来说,fflush(stdin)函数被解释为会清空输入缓冲区的 ...

  9. C++重载输入和输出操作符以及IO标准库中的刷新输入缓冲区残留字符问题

    今天在做C++ Primer习题的14.11时,印象中应该挺简单的一题,结果却费了很长时间. 类定义: typedef string Date; class CheckoutRecord{ publi ...

随机推荐

  1. JetBrains IntelliJ IDEA 15 Ultimate Edition版本激活破解

        由于JetBrains系列新版本注册激活发生了变化,所以原来的激活方式已经不能在使用. 只能用新的方式来破解了.此方式支持所有系列的新版版.包括IDEA15,PHPSTORM10,WEBSTO ...

  2. hadoop28---netty传对象

    Netty中,通讯的双方建立连接后,会把数据按照ByteBuf的方式进行传输,例如http协议中,就是通过HttpRequestDecoder对ByteBuf数据流进行处理,转换成http的对象.基于 ...

  3. python的垃圾回收机制 继承的顺序C3算法

    Python垃圾回收    -- 引用计数        -- Python为每个对象维护一个引用计数        -- 当引用计数为0的 代表这个对象为垃圾    -- 标记清除        - ...

  4. jenkins添加GIT repository报错

    添加了ssh互信,但一直提示如下错误. Failed to connect to repository : Command "git ls-remote -h git@git.xxx.cn: ...

  5. Linux之Shell 脚本加密工具-shc

    Much effort, much prosperity. 为什么要加密Shell脚本呢?当然是为了安全! 可能脚本里面涉及到密码之类的就需要进行加密了 一.下载安装shc工具 要保护自己编写的she ...

  6. Extracting info from VCF files

    R, Bioconductor filterVcf: Extract Variants of Interest from a Large VCF File (Paul Shannon) We demo ...

  7. Spring Boot 热部署的实现 - 原创

    实现方式有两大种(其中包含3种): 一.基于springloaded 1.1)Maven启动方式 第一步:在pom.xml中的“plugin节点”里面添加如下依赖: <dependencies& ...

  8. Red Hat OpenStack 10的新特性

    这是Red Hat有史以来最好的版本,同时也是第一个长生命周期版本(最长五年支持),这篇文章会介绍为什么这是你私有云最好的礼物. 由于要使用命令行,以前安装OpenStack是很繁重的工作.这个版本提 ...

  9. UWP

     东哥对UWP有兴趣么 Shine 2016/4/23 13:37:23 最近好像是重大更新 Shine 2016/4/23 13:37:27 https://blogs.msdn.microsoft ...

  10. C++构造函数知识点整理(C++11标准)

    引言 构造函数是c++中的一个比较难的语法知识点.编程实践中,由于在很多情况下可以不显示定义构造函数,或者,虽然定义构造函数的方式并不十分适当,但是程序也能正常运行,故而并不是特别引起开发者的重视. ...