关于getchar的用法及实例解析

365赌博是什么意思 ⌚ 2025-09-08 05:29:40 👤 admin 👁️ 4993 ❤️ 610
关于getchar的用法及实例解析

大家好,又见面了,我是你们的朋友全栈君。

getchargetchar解析一、getchar的返回类型及作用机制二、根据一段代码初步了解三、实例(“输入密码”)进一步了解1、代码达不到理想效果(1)原理详解(2)解决措施2、输入的密码中有空格 (1)原理详解(2)解决措施getchar解析一、getchar的返回类型及作用机制getchar——读取字符的函数

int getchar(void)

返回类型为int,参数为void.

有人可能会有疑惑,getchar既然是读取字符的,为什么返回类型是int呢?

1、getchar其实返回的是字符的ASCII码值(整数)。

2、getchar在读取结束或者失败的时候,会返回EOF。

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

二、根据一段代码初步了解下面我们一起来看看下面这段代码什么意思

代码语言:javascript代码运行次数:0运行复制#include

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、代码达不到理想效果我们再来看看下面这段代码

代码语言:javascript代码运行次数:0运行复制#include

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”给清理掉。

即代码变为

代码语言:javascript代码运行次数:0运行复制#include

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读。

代码语言:javascript代码运行次数:0运行复制//把缓冲区中的内容全读走

while ( getchar() != '\n')

{

;

}整段代码如下:

代码语言:javascript代码运行次数:0运行复制#include

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.cn/180204.html原文链接:https://javaforall.cn

相关数据

x5 m套件价格

x5 m套件价格

x5 m套件价格相关资讯 国产宝马x5配置,国产宝马x5配置轻混电机牌子 蔡金盛 2023-06-14 国产BMW X5新车提供了M Performance套件,包括蓝色的M制动卡钳,

06-30 365bet手机开户
淘米游戏 - 充值中心

淘米游戏 - 充值中心

支付宝 随机立减,先到先得 微信支付 米米卡 你正在使用支付宝充值米币 米币余额查询 充值问题反馈 在线客服 在线提问 充值的米米号: 确认

07-23 365赌博是什么意思
消失的库尔提拉斯王国和法师之都达拉然

消失的库尔提拉斯王国和法师之都达拉然

达拉然历史 初始 达拉然是阿拉索帝国时期最早建成的城邦之一。自创立以来,达拉然一直是洛丹伦大陆乃至整个艾泽拉斯世界的魔法中心。由

07-10 365bet娱乐平台官网
百事通app下载

百事通app下载

百事通app是由涡阳百事通网络技术服务有限公司研究发布的一款全国信息平台,能帮助不同地区的用户提供房屋租售、二手物品买卖、招聘求职

07-05 365赌博是什么意思
遗憾两连亚!英格兰全队离开酒店启程回国,索斯盖特挥手告别球迷

遗憾两连亚!英格兰全队离开酒店启程回国,索斯盖特挥手告别球迷

直播吧07月15日讯 欧洲杯决赛,英格兰1-2不敌西班牙,连续两届欧洲杯获得亚军。今日英格兰全队离开下榻的酒店,乘坐包机返回英国。 英格兰

08-09 365bet娱乐平台官网
英格兰主场球衣 2024 2025

英格兰主场球衣 2024 2025

葡萄牙客场球衣 2024 2025 儿童 69.90€ 初始价格为:69.90 欧元。39.90€当前价格为:39.90 欧元。 英格兰客场球衣 2024 2025 89.90€ 初始价格为:89.90

08-11 365赌博是什么意思