,,C语言超详细讲解getchar函数的使用

,,C语言超详细讲解getchar函数的使用

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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: