在C / C ++中清除输入缓冲区
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。
CSDN视频网址:http://edu.csdn.net/lecturer/144
什么是缓冲区?
临时存储区称为缓冲区,所有标准输入和输出设备都包含输入和输出缓冲器。在标准C / C ++中,流是缓冲的,例如在标准输入的情况下,
当我们按键盘上的键时,它不会发送到您的程序,而是由操作系统缓冲,直到时间被分配给程序。
它如何影响编程?
在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 ++的情况下:
#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 ++中清除输入缓冲区的更多相关文章
- scanf()中清除输入缓冲区的几种方法归纳
应用场景:我们使用多个scanf()的时候,如果输入缓冲区还有数据的话,那么scanf()就不会询问用户输入,而是直接就将输入缓冲区的内容拿出来用了,这就导致了前面的错误影响到后面的内容,为了隔离这种 ...
- c++清除输入缓冲区之 sync() vs ignore()
最近在写程序的时候总是不注意输入缓冲区内是否还有东西,导致出现了一些异常,调试了半天.所以来上一贴,学习注意,引以为戒! http://blog.chinaunix.net/uid-21254310- ...
- c++中清空输入缓冲区的方法(做cf的时候炸了)
C/C++ 四种清空输入缓冲区的方法 比较实用的一种 char c; while(c=getchar()!='\n'); 或者是这种 cin.ignore(count,c); count代表要清除的字 ...
- C语言清空输入缓冲区的N种方法对比
转自C语言清空输入缓冲区的N种方法对比 C语言中有几个基本输入函数: //获取字符系列 int fgetc(FILE *stream); int getc(FILE *stream); int get ...
- C语言清空输入缓冲区的N种方法对比【转】
转自:http://www.cnblogs.com/codingmylife/archive/2010/04/18/1714954.html C语言中有几个基本输入函数: //获取字符系列 int f ...
- [转][修]C清空输入缓冲区
为何要清空输入缓存区 读取时输入缓冲区中的内容会被scanf函数逐个取走,正常case下scanf()函数可以根据返回值判断成功取走的数目:但当发生读取异常之后,输入缓冲区中的内容并未被取走, ...
- C语言清空输入缓冲区的N种方法对比(转)
C语言中有几个基本输入函数: //获取字符系列 int fgetc(FILE *stream); int getc(FILE *stream); int getchar(void); //获取行系列 ...
- C 清空输入缓冲区,以及fflush(stdin)的使用误区和解决方法
转载:https://blog.csdn.net/Veniversum/article/details/62048870 对C 语言初学者来说,fflush(stdin)函数被解释为会清空输入缓冲区的 ...
- C++重载输入和输出操作符以及IO标准库中的刷新输入缓冲区残留字符问题
今天在做C++ Primer习题的14.11时,印象中应该挺简单的一题,结果却费了很长时间. 类定义: typedef string Date; class CheckoutRecord{ publi ...
随机推荐
- Django框架之ORM(数据库)操作
一.ORM介绍 映射关系: 表名 -------------------->类名 字段-------------------->属性 表记录----------------->类实例 ...
- CNN学习笔记:激活函数
CNN学习笔记:激活函数 激活函数 激活函数又称非线性映射,顾名思义,激活函数的引入是为了增加整个网络的表达能力(即非线性).若干线性操作层的堆叠仍然只能起到线性映射的作用,无法形成复杂的函数.常用的 ...
- hibernate validator 验证
@AssertTrue 用于boolean字段,该字段只能为true @AssertFalse 该字段的值只能为false @CreditCardNumber 对信用卡号进行一个大致的验证 @De ...
- Environment类包含的几个有用的方法
1.获取操作系统版本(PC,PDA均支持) Environment.OSVersion 2.获取应用程序当前目录(PC支持) Environment.CurrentDirectory 3.列举本地硬盘 ...
- VRChat简易教程3-往世界里导入模型和VRC接口初探
一.准备工作 按前面的教程新建一个project,导入sdk并创建地面(Terrain)和VRCWorld. 本教程中我们学习如何导入别人做好的模型并使用VRC提供的接口来实现物品的抓取,模型素材(小 ...
- AI理论学习笔记(一):深度学习的前世今生
AI理论学习笔记(一):深度学习的前世今生 大家还记得以深度学习技术为基础的电脑程序AlphaGo吗?这是人类历史中在某种意义的第一次机器打败人类的例子,其最大的魅力就是深度学习(Deep Learn ...
- [USACO08DEC]在农场万圣节Trick or Treat on the Farm
题目描述 Every year in Wisconsin the cows celebrate the USA autumn holiday of Halloween by dressing up i ...
- spring boot项目获取application配置文件参数的两种方式
前言:了解过spring boot这个技术的,应该知道spring boot的核心配置文件application.properties,当然也可以通过注解自定义配置文件**.properties的信息 ...
- Word Search, 在矩阵中寻找字符串,回溯算法
问题描述: Given a 2D board and a word, find if the word exists in the grid. The word can be constructed ...
- vue-cli 一分钟搭建自己的vue项目
创建项目 1.安装全局vue-cli npm install vue-cli -g 2.生成项目模板(my_projuct为项目名称) vue init webpack my_projuct 3.进入 ...