C语言中getchar()函数的详解

关于getchar()函数的基本作用

getchar()函数顾名思义就是获取一个字符,那么他从何处获取,返回值类型又是什么让我们在MSDN中找寻答案
在这里插入图片描述
我们可以看到getchar()函数的作用是从stdin(标准输入——键盘)获取字符,他的返回值类型是int,那我们不禁要问了,为什么getchar()读取的是一个字符而返回的却是整形呢,因为字符在存储时是以阿斯克码值存储的,返回整形是返回了他的阿斯克码值,当getchar()读取错误的时候会返回EOFEOF的含义就是end of file,是文件的结束标志
在这里插入图片描述

我们可以在编译器中转到定义发现EOF就是-1,也符合getchar()函数的返回值类型int。总结一下:

1.getchar()函数的作用是从标准输入键盘中读取一个字符
2.getchar()的返回值类型为整形,返回的是读取到字符的阿斯克码值
3.当getchar()函数读取失败时,返回EOF文件的结束标志。

以上就是带大家基本了解了一下getchar()函数。

getchar()函数基本案例

首先我们在代码中深入理解getchar()函数

#include<stdio.h>

int main()
{
	int ch = getchar();

	printf("%c\n", ch);

	putchar(ch);


	return 0;
}

在这里插入图片描述

我们看到当我们在键盘中输入大写的A,getchar()函数会获取到我们输入的A并赋值给ch,之后我们使用printfputchar()函数分别打印ch,结果如上图。那么getchar()函数是如何获取到我们输入的字符的呢?其实getchar()是从缓冲区中读取到的字符

在这里插入图片描述
一开始我们并没有输入任何字符,所以getchar()函数会在缓冲区等待,当我们键盘输入A并且按下回车时,在缓冲区中就会有A和\n两个字符
在这里插入图片描述
这时候getchar()函数发现了缓冲区中的字符拿走了A,赋值给了ch。

在循环当中的getchar()

int main()
{
	int ch = 0;

	while ((ch = getchar()) != EOF)
	{
		putchar(ch);
	}

	return 0;
}

在这里插入图片描述
如上图,将getchar()函数放在while循环当中作为条件,就可以实现连续输入和打印,那么这个代码的逻辑是怎样的呢?首先我们创建一个整形变量用于接收字符,用户键盘输入进入判断,如果getchar()正常获取字符那么我们进入循环打印字符,再次输入,如果getchar()获取字符异常返回EOF那么就跳出循环。我们用一个逻辑图让大家加强理解
在这里插入图片描述
在这里插入图片描述
当我们输入A+回车时会在缓冲区出现A\n两个字符,这时getchar()进入缓冲区拿去字符A,并且进入循环打印字符A,打印完成结束第一次循环,第二次循环开始,getchar()再次进入缓冲区拿去转义字符\n,第二次进入循环,打印\n换行,带三次循环,这时getchar()进入缓冲区时,缓冲区没有字符了,开始等待用户输入,直到getchar()获取失败返回EOF跳出循环。

getchar()函数的作用

上面的代码我们理解了之后,我们会想问这样的代码到底有什么用呢,为什么我们要学习getchar()函数呢,我们来看下面这个代码

int main()
{
	char password[20] = {0};
	printf("请输入密码:\n");
	scanf("%s", password);
	printf("请确认密码(Y/N):");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("密码正确\n");
	}
	else
	{
		printf("密码错误\n");
	}
	return 0;
}

在这里插入图片描述
我们想要的逻辑是,当我们输入密码后,再次输入Y/N来确认密码是否正确,但是我们发现,输出的结果当中,我们并没有输入Y或者N,他自动输出了密码错误,这是为什么呢?
在这里插入图片描述
当我们第一次输入时我们输入123456回车,我们在缓冲区会出现123456\n 7个字符,当我们的scanf在缓冲区中拿取字符时只会拿取123456,到\n了会停止拿取,当代码执行到getchar()时,缓冲区中存在的字符\n会直接被拿走放入ch当中,进入判断ch不等于Y,输出密码错误,那么如何解决这样的问题呢?我们提前把\n拿走是不是就可以了。

int main()
{
	char password[20] = {0};
	printf("请输入密码:\n");
	scanf("%s", password);
	printf("请确认密码(Y/N):");
	getchar();
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("密码正确\n");
	}
	else
	{
		printf("密码错误\n");
	}
	return 0;
}

在这里插入图片描述
我们在判断之前在加一个getchar()函数,提前将缓冲区中的\n取走,就可达到我们想要的目的,这样的方法叫做清理缓冲区。

清理缓冲区中多个字符

上面我们了解了当有一个\n的时候如何达到我们的目的,那么如果是多个字符呢?

int main()
{
	char password[20] = {0};
	printf("请输入密码:\n");
	scanf("%s", password);
	printf("请确认密码(Y/N):");
	getchar();
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("密码正确\n");
	}
	else
	{
		printf("密码错误\n");
	}
	return 0;
}

在这里插入图片描述
我们发现当我们在正确的密码后输入空格和其他字符时,我们的代码并不能正常运行,因为getchar()只能获取一个字符能力有限,所以我们需要对我们的代码进行改进。

int main()
{
	char password[20] = { 0 };
	printf("请输入密码:\n");
	scanf("%s", password);
	printf("请确认密码(Y/N):");
	//getchar();
	
	int tmp = 0;
	while ((tmp = getchar()) != '\n')
	{
		;
	}

	int ch = getchar();
	if (ch == 'Y')
	{
		printf("密码正确\n");
	}
	else
	{
		printf("密码错误\n");
	}
	return 0;
}

在这里插入图片描述

如图我们将getchar()放入while循环当中就可以实现缓冲区中多个字符的清除,当scanf进入缓冲区获取字符时会拿取123456,遇到空格scanf停止获取,之后进入循环getchar()进入缓冲区读取字符,只要没有读到\n循环就继续执行,遍历完缓冲区字符后,最后获取\n跳出循环,在进行我们的密码判断,此时用于获取判断字符的getchar()函数进入缓冲区,没有字符可以获取,进行等待,用户输入后获取字符进行判断。

  • 81
    点赞
  • 219
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悲伤猪小猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值