文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

C语言中getchar的用法以及实例解析

2024-04-02 19:55

关注

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的用法的实例解析。

总结

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

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯