关于getchar的用法及实例解析

关于getchar的用法及实例解析getchar——读取字符的函数intgetchar(void)返回类型为int,参数为void.有人可能会有疑惑,getchar既然是读取字符的,为什么返回类型是int呢?1、getchar其实返回的是字符的ASCII码值(整数)。2、getchar在读取结束或者失败的时候,会返回EOF。EOF意思是endoffile,本质上是-1.下面我们一起来看看下面这段代码什么意思#include<stdio.h>intmain(){ intch=0; wh

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

getchar解析

一、getchar的返回类型及作用机制

getchar——读取字符的函数

int getchar(void)

返回类型为int,参数为void.
有人可能会有疑惑,getchar既然是读取字符的,为什么返回类型是int呢?
1、getchar其实返回的是字符的ASCII码值(整数)。
2、getchar在读取结束或者失败的时候,会返回EOF。

EOF意思是end of file,本质上是-1.

二、根据一段代码初步了解

下面我们一起来看看下面这段代码什么意思

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

	return 0;
}

意思是
getchar先读取一个字符放到ch里面去,如果这个字符不等于EOF,就进入循环,打印这个字符。当getchar读到文件末尾或者结束时,它会返回一个EOF,此时结束循环。
我们来运行试一下
在这里插入图片描述
输入A,输出A;输入b,输出b…
当我们想要结束时,输入ctrl+Z,再按回车即可。

注意,如果上面的代码不用while循环的话,输入123,putchar()只会输出1。因为一个getchar一次只能读取一个字符。

三、实例(“输入密码”)进一步了解

1、代码达不到理想效果

我们再来看看下面这段代码

#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;
}

按理说,我们是想要输入密码,然后再输入N或者Y,根据我们输入的是N还是Y打印“确认成功”或“确认失败”。
我们来运行一下,看看是否是这样
在这里插入图片描述
可以看到,我们还没有输入Y或N,他就立马跳出来了一个“确认失败”
为什么会是这样呢?
请添加图片描述

(1)原理详解

我们来看看它其中的原理:
scanf和getchar都是输入函数,它们都是从键盘上来读取我们的数据,但它们不是直接从键盘上来读取我们的数据。它们和键盘之间有一个区域叫缓冲区
输入函数先来看缓冲区中是否有数据,如果有,它直接就拿走了,不需要从键盘输入,如果缓冲区什么都没有,则需要从键盘输入,再拿走。
在这里插入图片描述
明白这个道理后,我们回到上面那串代码。
最开始缓冲区里没有东西,所以我们这行代码

scanf(“%s”, password);

就是从键盘输入密码,我们输入123456。为了让123456放进去,我们还敲了一个回车,所以缓冲区里为

123456\n
在这里插入图片描述

接下来就是scanf来读缓冲区里的字符串了,scanf读取的方式是读取\n之前的内容,所以读取的是123456.
printf("请确认密码(Y/N):>");后,就是下面这行代码:

int ch = getchar();

getchar用来接收字符,
在这里插入图片描述
getchar看到缓冲区中有数据(\n),直接取走,不需要从键盘输入。自然也就出现了我们上面运行结果的那一幕:还没输入N或Y,就立马跳出“确认失败”了。

(2)解决措施

那么我们怎么解决这个问题呢?
很自然就能想到需要先把缓冲区里清空
那我们就在前面加一个getchar把缓冲区中的“\n”给清理掉。
即代码变为

#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;
}

运行一下即可发现,现在能够得到我们的理想结果。
在这里插入图片描述

2、输入的密码中有空格

不过又有一个问题,当我们输入密码为123456 789时(中间有一个空格),还没等我们输入N或Y,又立马跳出了“确认失败”。
这又是怎么回事呢?我们一起来看看

(1)原理详解

首先缓冲区里没有东西,我们需要通过键盘输入密码123456 789,
在这里插入图片描述
然后scanf就来取缓冲区中的数据,当它读到空格的时候,它就不再读了(这是scanf的一个作用性质)。
所以scanf就只取走了123456,而缓冲区中还剩下(空格) 789\n。
在这里插入图片描述

再往下,运行到getchar();这行代码,然而这里只有一个getchar,它只能读取一个字符,也就是只读了空格,缓冲区中还剩789\n。
在这里插入图片描述
再往下,就是我们的这行代码int ch = getchar();
getchar()一来就取走了缓冲区中的7,根本不需要我们从键盘输入N或Y。运行时自然它就自动跳出了“确认错误”。

(2)解决措施

所以我们需要把缓冲区中的东西先全部清走
那我们就用一个循环,只要没读到\n,我们就一直用getchar读

//把缓冲区中的内容全读走
	while ( getchar() != '\n')
	{ 
   
		;
	}

整段代码如下:

#include<stdio.h>
int main()
{ 
   
	char password[20] = { 
   0};

	printf("请输入密码:>");
	scanf("%s", password);

	//把缓冲区中的内容全读走
	while ( getchar() != '\n')
	{ 
   
		;
	}
	printf("请确认密码(Y/N):>");
	int ch = getchar();
	if (ch == 'Y')
	{ 
   
		printf("确认成功\n");
	}
	else
	{ 
   
		printf("确认失败\n");
	}

	return 0;
}

运行一下
在这里插入图片描述
是我们想要的效果。

以上就是关于getchar的用法的实例解析。如果对你有帮助,记得点赞?+关注哦!
我的主页还有其他文章,欢迎学习指点。
关注我,让我们一起学习,一起成长吧!请添加图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/180204.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android一键换手机,不同品牌手机一键换机:换新手机怎么转移数据?「建议收藏」

    android一键换手机,不同品牌手机一键换机:换新手机怎么转移数据?「建议收藏」我们正处于一个数码产品更新换代非常快速的时代,很多消费者会紧跟时代潮流,经常更换新手机,但是更换手机之后我们通常需要将旧手机里的数据进行转移,不同品牌之间的手机怎么进行一键换机呢?以安卓手机更换苹果手机转移数据为例:1、首先我们需要在安卓手机上安装“转移到iOS”APP,通过该应用我们可以将安卓手机的数据转移到新的苹果手机上2、确保安卓设备处于WiFi状态3、将安卓设备以及苹果设备连接电源4、设置…

    2022年5月26日
    101
  • linux手动安装gcc-5.1.0「建议收藏」

    linux手动安装gcc-5.1.0「建议收藏」yum源和apt-get源安装linux下安装gcc和g++时,可以使用源安装,例如:yuminstallgcc或者apt-getinstallgcc,但是这有个缺点,就是可能不能安装到你想要的版本,因此我们需要手动安装。下载gcc不同版本gcc是gnu的产品,所以我们可以去gnu官网去下,但是gnu下载的比减慢,这里提供一些大学的软件开元镜像源,比如清华大学:清华大学开元镜像源…

    2022年5月26日
    38
  • 薏米红豆粥的功效和实践演示

    薏米红豆粥的功效和实践演示

    2021年12月17日
    40
  • clone一个react项目怎么运行[通俗易懂]

    首先当你从git上面clone一个项目的时候怎么让项目跑起来,首先看项目目录结构,找到README.md上面有项目运行的步骤,如果没有可以看package.json文件,找到scripts上面有dev所以跑起来项目就使用npmrundev有start就使用npmstart但是要先安装项目依赖使用npminstall依赖下载完成就可以使用npmrundev/npm…

    2022年4月15日
    33
  • mysql基本sql语句大全(基础用语篇)_mysql常用查询语句

    mysql基本sql语句大全(基础用语篇)_mysql常用查询语句MySQL常用语句大全一、连接MySQL格式:mysql-h主机地址-u用户名-p用户密码1、例1:连接到本机上的MYSQL。首先在打开DOS窗口,然后进入目录mysqlbin,再键入命令mysql-uroot-p,回车后提示你输密码,如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是:m…

    2022年9月5日
    4
  • php错误处理_MSVCP120.dll

    php错误处理_MSVCP120.dll当您搜索“phpMSVCR110.dll”时,由于此问题的链接显示在返回结果的最上方(更不用说它的浏览量已超过10万,并且还在不断增长),因此,这里有一些其他说明,在您寻求以下内容时可能会派上用场解决MSVCR110.dll错误…答案中描述的方法不仅对MSVCR110.dll情况有效,而且在寻找其他版本(例如较新的MSVCR71.dll)时也适用,并且我将答案更新为包括VC15,即使它不…

    2025年7月27日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号