打印
[经验分享]

关于getchar的用法

[复制链接]
333|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hudi008|  楼主 | 2024-4-26 15:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ar, tc, ge, ETC
(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;}
运行一下

是我们想要的效果。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

240

主题

9421

帖子

11

粉丝