关于getchar的用法及实例解析_getchar的用法

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

getchar

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循环的话输入123putchar()只会输出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的用法的实例解析。如果对你有帮助记得点赞👍+关注
我的主页还有其他文章欢迎学习指点。
关注我让我们一起学习一起成长吧请添加图片描述

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6