我的编程空间,编程开发者的网络收藏夹
学习永远不晚

最新C语言中getchar的使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

最新C语言中getchar的使用

getchar的使用

1.从缓冲区读走一个字符,相当于清除缓冲区  

2.前面的scanf()在读取输入时会在缓冲区中留下一个字符'\n'(输入完s[i]的值后按回车键所致),所以如果不在此加一个getchar()把这个回车符取走的话,gets()就不会等待从键盘键入字符,而是会直接取走这个“无用的”回车符,从而导致读取有误  

3.  
getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab)  
getchar()使用不方便,解决方法:   
(1)使用下面的语句清除回车:   
while(getchar()!='\n');   
(2)用getche()或getch()代替getchar(),其作用是从键盘读入一个字符(不用按回车),注意要包含头文件<conio.h>  

4. 
getchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,也就是说,如果stdin有数据的话不用输入它就可以直接读取了,第一次getchar()时,确实需要人工的输入,但是如果你输了多个字符,以后的getchar()再执行时就会直接从缓冲区中读取了。  
实际上是 输入设备->内存缓冲区->程序getchar    
你按的键是放进缓冲区了,然后供程序getchar    
你有没有试过按住很多键然后等一会儿会滴滴滴滴响,就是缓冲区满了,你后头按的键没有存进缓冲区.    
键盘输入的字符都存到缓冲区内,一旦键入回车,getchar就进入缓冲区读取字符,一次只返回第一个字符作为getchar函数的值,如果有循环或足够多的getchar语句,就会依次读出缓冲区内的所有字符直到'\n'.要理解这一点,之所以你输入的一系列字符被依次读出来,是因为循环的作用使得反复利用getchar在缓冲区里读取字符,而不是getchar可以读取多个字符,事实上getchar每次只能读取一个字符.如果需要取消'\n'的影响,可以用getchar();来清除,这里getchar();只是取得了'\n'但是并没有赋给任何字符变量,所以不会有影响,相当于清除了这个字符.还要注意的是这里你在键盘上输入ssss看到的回显正是来自于getchar的作用,如果用getch就看不到你输入了什么.

1、首先,我们看一下这段代码:

它的简单意思就是从键盘读入一个字符,然后输出到屏幕。理所当然,我们输入1,输出就是1,输入2,输出就是2。

那么我们如果输出的是12呢?

它的输出是1。

这里我们先简单的解释下,因为当我们从键盘输入字符‘1’,‘2’,并按下回车后,我们的输入被放入了输入缓冲区,这个时候getchar()会从缓冲区中读取我们刚才的输入,一次只读一个字符,所以字符1就被拿出来了,赋值给了c,然后putchar()又将c放在了标准输出,也就是这里的屏幕,所以我们看见了最终的显示结果1。同时字符‘1’也被缓冲区释放了,而字符‘2’仍然被留在了缓冲区。而这样是很不安全的,有可能下次使用的时候,我们的缓冲区会读到一些垃圾,但是当程序结束的时候,它会自动刷新。

2、我们接着看下面的代码:

大家觉得这几行代码是什么意思呢?大家是否真的看懂了呢?

如果你觉得你看懂了,那么我提一个问题,你觉得是不是你从键盘输入一个字符就会输出一个字符,直到遇见了换行符呢?

emmmmm。

如果你真的这么想了,那你就错了。

它真正的运行过程应该是这样的:还记得我们刚才说过的东西吗,getchar()会从输入缓冲区去读取内容,也就是说我们把所有的内容都输入完成并且按下了Enter键后,我们的输入才被送进去了输入缓冲区,这个时候,while循环才开始工作,每一次getchar()从输入缓冲区读取一个字符,然后如果不是换行符就输出。

3、那么我们为什么要使用缓冲区呢?

举个例子,我们知道计算机CPU的处理速度很快的,而我们键盘的输入速度总是比不过CPU的处理速度,那么CPU就得一直等着键盘输入完,这样很浪费资源。于是,我们党键盘输入完了,再让CPU一次性处理,这样就会大大地提高效率。

又比如,我们的打印机打印文档,打印机的处理速度是很慢的,所以我们会将文档输出到打印机的缓存中去,这样打印机就可以自行慢慢打印,而不必占用CPU资源。

4、缓冲区的类型

  缓冲区 分为三种类型:全缓冲、行缓冲和不带缓冲。

  1、全缓冲

  在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。全缓冲的典型代表是对磁盘文件的读写。

  2、行缓冲

  在这种情况下,当在输入和输出中遇到换行符时,执行真正的I/O操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的I/O操作。典型代表是键盘输入数据。

  3、不带缓冲

  也就是不进行缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示出来。

5、缓冲区的刷新

缓冲区会在以下三种情况下被刷新:

1、缓冲区满

2、执行flush刷新缓冲区的语句

3、程序正常结束。

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

扩展知识:

C语言】getchar 函数的正确使用

一、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 的换行问题

我们来观察下面这段代码

#include<stdio.h>
int main()
{
	int ch = 0;
	while ((ch = (getchar())) != EOF)
	{
		putchar(ch);
	}
	return 0;
}

在这里插入图片描述

我们可以看到我们每次从键盘输入一个字符并回车后,putchar输出时会自动换行,就是因为我们每次除了输入字符外,还敲了一个回车,而这个回车会被存储在缓冲区中,当我们用getchar读取字符时,会从缓冲区中依次逐个读取所有的字符(包括换行、空格、Tab),直到缓冲区中没有数据,每读取一个字符就用putchar打印一下,所以这里会自动换行。

在这里插入图片描述

^Z:Ctrl+Z,输入后会被认定为EOF,从而来结束循环(VS中有些时候要重复按三次才会结束循环,其他编译器都是按一次)。

2、getchar 与 scanf 的混合使用

我们来观察下面这段代码:

#include<stdio.h>
int main()
{
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);
	printf("请确认密码(Y/N):>");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}
	return 0;
}

在这里插入图片描述

我们可以看到程序并没有等待我们输入Y/N来确认密码,而是直接结束,原因就是我们缓冲区中存放的是abcdef\n,而scanf函数是遇到空格、换行符(\n)、Tab时结束,所以\n并没有被读取走,而是继续留在了缓冲区中,而当getchar读取数据时发现缓冲区中并不为空,所以直接读取了\n,然后判断if条件,结束程序,而不会等待我们输入Y/N。

那么要如何避免这种情况发生呢?有两种方法:
法一:在scanf后面加一个getchar(不推荐)

#include<stdio.h>
int main()
{
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);
	getchar();  //读取剩下的\n
	printf("请确认密码(Y/N):>");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}
	return 0;
}

在这里插入图片描述

我们在scanf函数后面加上一个getchar函数,用于清空缓冲区里面多余的\n,但是这种方法有弊端,不推荐使用,具体弊端如下:

在这里插入图片描述

如图:我们从键盘输入abcd ef,我们可以看到,程序并没有等待我们输入Y/N,而是直接执行if语句,这是因为 scanf函数遇到空格、换行符(\n)、Tab时会停止读取,所以缓冲区中剩下的字符是_ef\n,一次getchar无法清空缓冲区。所以说,法一只能解决一部分情况,想要彻底解决scanf缓冲区残留的问题需要用到法二。

法二:在scanf后面加 while( getchar() != ‘\n’) 语句(推荐)

#include<stdio.h>
int main()
{
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);
	getchar();  //读取剩下的\n
	printf("请确认密码(Y/N):>");
	while (getchar() != '\n')
	{
		;
	}
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}
	return 0;
}

在这里插入图片描述

在这里插入图片描述

程序中的while( getchar() != ‘\n’)语句会不断读取缓冲区中的字符,直到把\n读取走,从而达到清空缓冲区的目的。

到此这篇关于最新C语言中getchar的使用的文章就介绍到这了,更多相关getchar的使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

最新C语言中getchar的使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

最新C语言中getchar的使用

getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab),getchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,本文给大家介绍getchar的使用,感兴趣的朋友跟随小编一起看看吧
2022-12-08

c语言中getchar怎么使用

在C语言中,getchar()函数用于从标准输入(键盘)获取一个字符。使用getchar()函数的基本语法如下:```cint getchar(void);```要使用getchar()函数,首先需要包含stdio.h头文件。getchar
2023-09-05

c语言中的getchar怎么用

c语言中getchar函数用于从标准输入读取字符:1. 声明getchar函数。2. 调用getchar函数,获取输入字符。3. 处理输入字符。c语言中getchar的用法getchar函数是一个标准输入函数,用于从标准输入(通常是键盘)
c语言中的getchar怎么用
2024-05-08

C语言中的getchar函数怎么使用

本文小编为大家详细介绍“C语言中的getchar函数怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言中的getchar函数怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。首先要明确getcha
2023-07-05

C语言中getchar的使用方法是什么

getchar()函数用于从标准输入流(stdin)读取一个字符,并返回该字符的ASCII码值。它的基本用法如下:int getchar(void);使用getchar()函数时,通常需要将返回的字符值赋给一个整型变量,然后再进行其他操作
C语言中getchar的使用方法是什么
2024-03-06

C语言getchar和scanf怎么使用

getchar函数用于从标准输入流中读取一个字符,其函数原型为:```int getchar(void);```使用方法如下:```c#include int main() {char c;printf("请输入一个字符:");c = ge
2023-06-12

c语言中getch,getche,getchar的区别

getche() 和getch()很相似,它也需要引入头文件conio.h,那它们之间的区别又在哪里呢?不同之处就在于getch()无返回显示,getche()有返回显示
2022-11-15

c语言getchar的作用有哪些

getchar函数是C语言中的一个标准库函数,其作用主要有以下几点:1. 从标准输入(通常是键盘)读取一个字符。2. 返回值为读取到的字符的ASCII码值。3. 可以与其他输入输出函数(如printf、scanf等)配合使用,用于获取用户输
2023-09-04

c语言getchar函数的作用是什么

`getchar()` 是 C 语言标准库中的一个函数,其作用是从标准输入流(也就是键盘)读取一个字符,并返回该字符的 ASCII 值。具体来说,`getchar()` 函数会等待用户在控制台输入一个字符,然后将该字符读取到内存中的一个整型
c语言getchar函数的作用是什么
2024-02-29

在C语言中getchar的使用方法和读取规则讲解

getchar中文意思是获取字符,getchar函数从标准输入输出里读取下一个字符,返回类型为int整形,返回用户输入的ASCII码值,如果到达文件末尾或者出错返回EOF,这篇文章主要介绍了在C语言中getchar的使用方法和读取规则,需要的朋友可以参考下
2022-12-08

c语言getchar函数的用法是什么

getchar函数用于从标准输入流(即键盘)读取一个字符,并返回该字符的ASCII码值。它的原型如下:int getchar(void);该函数不需要任何参数,且返回值为int类型,表示读取的字符的ASCII码值。使用方法如下:#i
2023-10-20

C语言中getchar函数详解看这一篇就够了(函数功能、使用、返回值)

getchar读取字符的函数,今天通过本文给大家介绍C语言中getchar函数简介用法示例详解,感兴趣的朋友跟随小编一起看看吧
2023-02-28

C语言中的assert怎么使用

在C语言中,`assert`是一个宏,用于在程序中插入断言语句,用于检查程序中的特定条件是否满足。如果断言条件为真,则程序继续执行;如果断言条件为假,则程序终止,并显示错误消息。`assert`的使用方法如下:1. 首先,包含``头文件。`
2023-08-12

c语言中的case怎么使用

这篇文章主要介绍“c语言中的case怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“c语言中的case怎么使用”文章能帮助大家解决问题。在c语言中,case的意思为“情况”、“案例”,是用于s
2023-07-04

怎么使用C语言中的typedef

本篇内容介绍了“怎么使用C语言中的typedef”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在单片机和操作系统中 typedef 会经常用
2023-06-25

C语言中pthread_exit和pehread_join的使用

C语言中pthread_exit立即终止线程执行,并将返回状态和清理处理程序写入线程数据。pthread_join等待线程终止并检索其退出状态。它们用于协调多线程程序,创建和加入线程、传递退出状态和注册清理处理程序。需要注意线程只能调用一次pthread_exit,线程在未调用pthread_exit的情况下终止时退出状态为PTHREAD_CANCELED。
C语言中pthread_exit和pehread_join的使用
2024-04-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录