c库函数intgetchar(void)从标准输入stdin中获取一个字符(无符号字符)。这相当于将stdin作为参数的getc。让我们仔细看看。
:
目录
1.getchar函数2,缓冲区1,缓冲区2是什么,缓冲区3为什么存在,缓冲区类型4,缓冲区刷新3。正确使用getchar函数1。getchar 2的换行问题。getchar和scanf的混合使用
一、getchar 函数
从上面的介绍来看,要想正确使用getchar函数,首先要了解什么是缓冲区。
二、缓冲区
1、什么是缓冲区
缓冲区,也称为缓存,是内存空间的一部分。
也就是说,在内存空间中预留了一定的存储空间,用来缓冲输入或输出的数据。这个保留的空间称为缓冲区。
缓冲区根据其对应的输入设备和输出设备分为输入缓冲区和输出缓冲区。
2、为什么要存在缓冲区
为什么要引入缓冲区?
比如我们从磁盘上取信息时,先把读取的数据放在缓冲区,然后计算机直接从缓冲区取数据,取出缓冲区的数据后再从磁盘上读取,这样可以减少磁盘的读写次数。另外,计算机操作缓冲区的速度比磁盘快得多,所以应用缓冲区可以大大提高计算机的运行速度。
例如,我们用打印机打印文件。因为打印机的打印速度比较慢,所以我们先把文档输出到打印机相应的缓冲区,然后打印机再一步一步打印出来。这个时候我们的CPU就可以处理其他的事情了。现在你基本上明白了,缓冲区是一个内存区域,在输入输出设备和CPU之间用来缓存数据。它使低速输入输出设备和高速CPU协调工作,防止低速输入输出设备占用CPU,释放CPU,使其高效工作。
3、缓冲区的类型
有三种类型的缓冲器:全缓冲、行缓冲和无缓冲。
1.完全缓冲
在这种情况下,实际的I/O操作仅在标准I/O缓存填满后执行。全缓冲的典型代表就是读写磁盘文件。
2.线路缓冲
在这种情况下,当输入和输出中遇到换行符时,就会执行真正的I/O操作。此时,我们输入的字符首先存储在缓冲区中,实际的I/O操作只有在按回车键换行时才执行。通常是键盘输入数据。
3.没有缓冲
即不进行缓冲,标准错误情况stderr就是典型代表,使错误信息直接尽快显示出来。
4、缓冲区的刷新
以下四种情况会触发缓冲区刷新:
当缓冲器满时;执行flush语句;执行endl语句;关闭文件。
三、getchar 函数的正确使用
1、getchar 的换行问题
让我们看看下面的代码。
# includestdio.h
int main()
{
int ch=0;
while ((ch=(getchar()))!=EOF)
{
putchar(ch);
}
返回0;
}
我们可以看到,每次我们从键盘输入一个字符,按下回车键,putchar就会在输出的时候自动换行。是因为我们每输入一个字符,也要输入一个回车,这个回车会存储在缓冲区里。当我们用getchar读取字符时,我们会从缓冲区中逐个读取所有的字符(包括换行符、空格、制表符),直到缓冲区中没有数据。我们读到的每个字符都会用putchar打印出来,所以这里
Z: Ctrl Z,输入后会被识别为EOF,从而结束循环(有时候在VS中,你要反复按三次才能结束循环,而其他编译器是按一次)。
2、getchar 与 scanf 的混合使用
让我们观察下面的代码:
# includestdio.h
int main()
{
char password[20]={ 0 };
Printf('请输入密码:');
scanf('%s ',密码);
Printf('请确认密码(Y/N):');
int ch=getchar();
if (ch=='Y ')
{
Printf('确认成功\ n ');
}
其他
{
Printf('确认失败\ n ');
}
返回0;
}
我们可以看到程序并没有等我们输入Y/N确认密码,而是直接结束了。原因是我们将abcdef\n存储在缓冲区中,而scanf函数在遇到空格、换行符(\n)或制表符时结束,所以\n没有被读取,而是保留在缓冲区中。当getchar读取数据时,发现缓冲区不为空,于是直接读取\
那么如何避免这种情况呢?有两种方法:
方法1:在scanf之后添加一个getchar(不推荐)
# includestdio.h
int main()
{
char password[20]={ 0 };
Printf('请输入密码:');
scanf('%s ',密码);
getchar();//读取其余部分\n
Printf('请确认密码(Y/N):');
int ch=getchar();
if (ch=='Y ')
{
Printf('确认成功\ n ');
}
其他
{
Printf('确认失败\ n ');
}
返回0;
}
我们在scanf函数后添加了一个getchar函数来清空额外的缓冲区,但是这种方法有缺点,不推荐使用。具体缺点如下:
如图:我们从键盘输入abcd ef。我们可以看到程序并没有等待我们输入Y/N,而是直接执行if语句。这是因为scanf函数在遇到空格、换行符(\n)和制表符时会停止读取,所以缓冲区中剩余的字符是_ef\n,getchar无法清空缓冲区一次。所以第一种方法只能解决部分情况,需要第二种方法才能完全解决残留scanf缓冲的问题。
方法二:在scanf后面加while( getchar())!='\n' \ n ')语句(推荐)
# includestdio.h
int main()
{
char password[20]={ 0 };
Printf('请输入密码:');
scanf('%s ',密码);
getchar();//读取其余部分\n
Printf('请确认密码(Y/N):');
while (getchar()!='\n ')
{
;
}
int ch=getchar();
if (ch=='Y ')
{
Printf('确认成功\ n ');
}
其他
{
Printf('确认失败\ n ');
}
返回0;
}
While( getchar())在程序中!='\n' \n ')语句将一直读取缓冲区中的字符,直到\n被读走,从而清空缓冲区。
这就是这篇关于C语言的文章,详细解释了getchar函数的用法。关于C语言中getchar函数的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。