getchar函数、putchar函数以及输入缓存区

我们知道,在c语言里,一般输入输出都会使用scanf和printf函数,比如

#include<stdio.h>
int main() {
	int n = 0;
	scanf("%d", &n);
	printf("%d", n);
	return 0;
}

这段代码就是输入一个整数n,在屏幕上打印一个整数n。那么除了scanf和printf还有其他方法可以用来输入输出吗?

接下来我们就介绍一下今天的主角,getchar和putchar函数。

 

 这是getchar和putchar的一些相关介绍,包括他们的功能、参数和返回值,那么他们和scanf和printf函数有什么不同呢?

首先,getchar函数对应scanf函数,putchar函数对应printf函数。

getchar的返回值是int类型,返回的是接收到字符的ASCII码值,我们可以看个例子:

我们知道小写a的 ASCII值正好是97,因此在输入小写a时,n的值为97。

如果getchar读取失败时,会返回EOF,这点和scanf是一样的。我们可以利用这一点,完成多次输入输出,比如:

 这段代码运行看着是不是很简单呀?但是它的工作原理却并不简单。

大家仔细看的话可以发现,getchar的参数类型是void,这是因为getchar会在一个叫做输入缓存区的地方去读取字符(scanf读取也是从输入缓存区读取),我们每次从键盘输入的字符,都会传到输入缓冲区里,然后才被getchar接收。

 第一行我们输入了 :a回车,putchar输出了a\n,原理是我们输入的a回车都会先进入到输入缓存区中,然后getchar先读取a,putchar输出a,然后读取回车(\n),所以输出的a之后才会有换行。第二次我们输入的:A回车原理也是一样,第三次我们输入了abc回车,所以输出abc后才进行了换行,第四次我们输入了ctrl+Z,这时输出了^Z,也就是EOF,程序才终止了。

给大家再看一个例子体验一下getchar的作用:

 我们发现,在确认密码时,明明什么都没有输入,却直接输出了确认失败,这是为什么呢?

原因是:我们在输入密码时,输入了:123456\n,此时输入缓存区中就有123456\n,scanf函数将123456读取,放入到password中,而还剩一个\n没被读取,上面说过,getchar读取会在输入缓存区中读取,所以此时的getchar就把\n读取并放入到了ch中,导致ch!='Y',输出确认失败!

(这里再说一下,scanf函数只读取自己想要的结果,包括遇到空格他都不会再继续往下读取,所以和getchar不相同。)

为了解决这个问题,我们可以在密码输入之后再加一个getchar,将多余的\n读取即可,此时getchar的作用为清理缓存区,如下:

 此时就万事大吉了吗?NONONO,我们再接着往下看

 我们在输入了123456 xxxx后,程序又双叒叕出现问题了,我们上边说过,scanf读取到空格都会停止,而getchar每次只能读取一个字符,此时的缓存区里就有非常多的东西,这时候,我们可以使用循环解决。

 我们让getchar不断的清理缓存区,直到遇到回车(\n)。

接下来介绍一下putchar,putchar很简单,就是简单的输出传入的数据,他的返回值是int类型,返回的是传入字符的ASCII值,比如:

我们输入了小写a,putchar本身会输出一个传入的数据,即输出小写a,然后我们将putchar的返回值传给n,再输出n,即97。

以上即为对于getchar和putchar以及输入缓存区知识的分享,如有错误,还请指正。 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值