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

原创 2017年06月04日 21:46:23

笔者介绍:姜雪伟,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”,告诉编译器忽略缓冲区,并且在字符串或字符数组的实际内容之前丢弃所有的空格。


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jxw167/article/details/72861631

C语言在嵌入式开发中的应用

该课程以STC系列单片机为基础,深入浅出,结合理论和实际操作技巧,讲解C51应用的开发基础及实践经验。通过本课程,读者可以基本掌握基于C51的单片机开发所需要的理论基础和实践经验。尽管是以STC单片机为基础,涉及不同概念的时候,课程仍然会详尽指出标准89c51系列单片机会遇到什么问题。课程建议读者具备一定的语言基础,任何编程语言都可以
  • 2015年01月11日 11:32

C语言清空缓冲区

看下面一个例子: [cpp] view plain copy   #include    int main()   {       int nu...
  • qq_35212671
  • qq_35212671
  • 2016-11-20 22:22:03
  • 5491

C语言编程 - 清空键盘缓冲区

转载自这里 清空键盘缓冲区很多种方法,如用fflush(stdin); rewind(stdin);等,但是在linux这些都不起作用,还得我今天试了半天都没成功,上网搜了一下发现setbu...
  • gaopu12345
  • gaopu12345
  • 2014-06-13 09:25:17
  • 8203

C语言清空输入缓冲区

先来看一段代码: #include int main() { int num; char ch ; scanf("%d", &num); scanf("%c", &ch); prin...
  • guanyasu
  • guanyasu
  • 2016-11-14 00:08:21
  • 5124

C语言之清空缓存区

在C语言中,我们常常需要去清空缓存区,对于缓存区清空的重要性,接下来我们进行具体的说明。 首先我们先解释一下缓存区。1.缓存区C语言中的缓冲区又称为缓存,它是内存空间的一部分。   也就是说,在内...
  • qq_26768741
  • qq_26768741
  • 2016-03-19 22:33:11
  • 9604

C语言如何清除scanf()缓存

(1)清除缓存的函数是: void safe_flush(FILE *fp) { int ch; while( (ch = fgetc(fp)) != EOF && ch != '\n' ); ...
  • u010870518
  • u010870518
  • 2014-12-04 22:12:57
  • 4623

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

又重新过一遍C语言,感觉每次重学C语言都有不同的感受,遇到了一个问题,就是scanf()这个问题,其实细究起来,也有很多可以值得深挖的,实际上每次细细的挖掘的话,都是对C语言的更透彻的认识. 那么下...
  • phao89
  • phao89
  • 2016-01-19 23:19:22
  • 2316

清空缓冲区的方法

今天发现了清空缓冲区的问题,上网搜寻,发现如下方法。1.输入输出缓冲区的概念(C++用的多一些)    我想以一个例子说明,比如我想把一篇文章以字符序列的方式输出到计算机显示器屏幕上,那么我的程序内存...
  • thecorr
  • thecorr
  • 2007-12-07 14:02:00
  • 6211

cin的用法及清空输入缓冲区问题

问题描述:编程时遇到一个问题
  • zhao708981169
  • zhao708981169
  • 2014-07-02 14:34:13
  • 7452

Linux程序设计 清空标准输入缓冲区

今天在Linux程序设计的时候需要清空标准输入缓冲区,于是使用了如下Windows程序设计中的方法: 1.fflush(stdin);这个fflush()函数根本不是标准C中的函数,只是标准C的...
  • edonlii
  • edonlii
  • 2014-04-25 14:51:01
  • 3059
收藏助手
不良信息举报
您举报文章:在C / C ++中清除输入缓冲区
举报原因:
原因补充:

(最多只允许输入30个字)