关于getchar函数缓冲区的问题

简介:

最近,看到有同学问我关于getchar()这个函数缓冲区的问题,结合我以前的学习,我将对getchar()进行一次总结,当然,这些都是别人已经提过的东西,我只是总结,接下来我们来看看。

首先,用getchar()函数进行字符的输入,并不是直接从键盘这个硬件中读取输入的字符,而是从“输入缓冲区”中得到的字符。输入缓冲区是一个字符的队列,其中存储了所有你尚未读取的字符。每次调用getchar函数,它就会从输入缓冲区中读出第一个字符,并把这个字符从输入缓冲区中清除。
然而,这个输入缓冲区的设计,是把所有从键盘上输入的东西都放进去的,包括你每次按的回车符‘\n’,而getchar函数只读走了你在回车前输入的那个字符,而将回车符保留在了输入缓冲区中。于是,第二次调用getchar时,函数就从输入缓冲区中读出了'\n'。
要解决这个问题,有两种可行的途径。一是多加一个getchar(),过滤掉回车,但是这种方法有不足,就是如果你在调用第一个getchar时输入了多个字符,那么,加入一个getchar并不能把所有未读取的字符过滤。如果你的本意是重新从“键盘”读取的话,最好是加一个
fflush(stdin);
清除输入缓冲区

来个例子吧:

<span style="font-size:18px;">#include <stdio.h>
#include <stdlib.h>
int main(void)
{
	printf("\n pls input num:\n");
	char ch ,sh ; 
	ch = getchar();
//	fflush(stdin);
	sh = getchar();
	printf("\n out put:\n");
	putchar(ch);
	putchar('\n');
	putchar(sh);
	return 0 ;
}</span>
运行结果:

我们看到,第二个getchar并没有获取到相应的字符,而只是获取了一次就输出了。

我们把注释去掉看看:

<span style="font-size:18px;">#include <stdio.h>
#include <stdlib.h>
int main(void)
{
	printf("\n pls input num:\n");
	char ch ,sh ; 
	ch = getchar();
	fflush(stdin);
	sh = getchar();
	printf("\n out put:\n");
	putchar(ch);
	putchar('\n');
	putchar(sh);
	return 0 ;
}</span>
运行结果:

当输入缓冲区被刷新以后,那么就可以连续输入两次,并且都输出啦!



总结:输入有缓冲区,输出也是有缓冲区的,这个问题,往后咱们再讨论

目录
相关文章
sign check fail:check Sign and Data Fail报错攻略
错误码: com.alipay.api.AlipayApiException: sign check fail: check Sign and ​Fail            报错原因:验签失败 ,未使用正确的支付宝公钥     在新版接口的调用过程中,常常出现此报错。
5455 12
|
1月前
|
数据采集 JSON BI
京东评论API能挖出多少“神评”?用代码揭秘用户真实反馈
京东商品评论API提供商品全量评论数据,支持按评分、时间筛选及分页获取,返回120+字段与口碑统计,具备高并发、低延迟、数据安全等特性,助力电商分析与决策。
|
域名解析 缓存
nslookup 查询已经解析,但是域名解析无法访问
nslookup 已经解析,域名解析规则:域名和主机双向绑定才能才能访问
1538 0
|
4月前
|
运维 容灾 调度
突破算力瓶颈:库存感知下的多地域 GPU 弹性调度
介绍多集群通过基于库存的弹性调度提供了 GPU 在多地域供给问题的解决方案。
|
SQL 关系型数据库 MySQL
MySQL——MySQL的图形化界面工具安装与使用
MySQL——MySQL的图形化界面工具安装与使用
884 0
|
7月前
|
人工智能 自然语言处理 搜索推荐
阶跃多模态再添一员:阶跃与 ACE Studio 联合开源音乐大模型 ACE-Step!
阶跃多模态再添一员:阶跃与 ACE Studio 联合开源音乐大模型 ACE-Step!
594 10
|
缓存 开发者 Python
深入探索Python中的装饰器:原理、应用与最佳实践####
本文作为技术性深度解析文章,旨在揭开Python装饰器背后的神秘面纱,通过剖析其工作原理、多样化的应用场景及实践中的最佳策略,为中高级Python开发者提供一份详尽的指南。不同于常规摘要的概括性介绍,本文摘要将直接以一段精炼的代码示例开篇,随后简要阐述文章的核心价值与读者预期收获,引领读者快速进入装饰器的世界。 ```python # 示例:一个简单的日志记录装饰器 def log_decorator(func): def wrapper(*args, **kwargs): print(f"Calling {func.__name__} with args: {a
184 2
|
小程序 JavaScript 前端开发
基于微信小程序的商城购物系统的设计与实现(论文+源码)_kaic
基于微信小程序的商城购物系统的设计与实现(论文+源码)_kaic
|
缓存 负载均衡 算法
HTTPS对性能的一些影响
HTTPS对性能的一些影响
748 9
|
12月前
|
前端开发 Linux C#
一款开源、免费、美观的 Avalonia UI 原生控件库 - Semi Avalonia
一款开源、免费、美观的 Avalonia UI 原生控件库 - Semi Avalonia
1092 10