我们知道,在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以及输入缓存区知识的分享,如有错误,还请指正。