问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

getchar函数详解:用法、实例及常见问题解决方案

创作时间:
作者:
@小白创作中心

getchar函数详解:用法、实例及常见问题解决方案

引用
CSDN
1.
https://blog.csdn.net/m0_53558236/article/details/119744614

getchar函数详解

一、getchar的返回类型及作用机制

getchar是一个用于读取字符的函数,其函数原型如下:

int getchar(void)

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

  1. getchar其实返回的是字符的ASCII码值(整数)。
  2. getchar在读取结束或者失败的时候,会返回EOF。

EOF表示文件结束,本质上是-1。

二、通过代码初步了解

下面是一段使用getchar的示例代码:

#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,他就立马跳出来了一个“确认失败”。

原理详解:

scanf和getchar都是输入函数,它们都是从键盘上来读取我们的数据,但它们不是直接从键盘上来读取我们的数据。它们和键盘之间有一个区域叫缓冲区

输入函数先来看缓冲区中是否有数据,如果有,它直接就拿走了,不需要从键盘输入,如果缓冲区什么都没有,则需要从键盘输入,再拿走。

明白这个道理后,我们回到上面那串代码。最开始缓冲区里没有东西,所以我们这行代码:

scanf("%s", password);

就是从键盘输入密码,我们输入123456。为了让123456放进去,我们还敲了一个回车,所以缓冲区里为:

123456\n

接下来就是scanf来读缓冲区里的字符串了,scanf读取的方式是读取\n之前的内容,所以读取的是123456。

printf("请确认密码(Y/N):>");后,就是下面这行代码:

int ch = getchar();

getchar用来接收字符,getchar看到缓冲区中有数据(\n),直接取走,不需要从键盘输入。自然也就出现了我们上面运行结果的那一幕:还没输入N或Y,就立马跳出“确认失败”了。

解决措施:

需要先把缓冲区里清空。即代码变为:

#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,又立马跳出了“确认失败”。

原理详解:

首先缓冲区里没有东西,我们需要通过键盘输入密码123456 789,然后scanf就来取缓冲区中的数据,当它读到空格的时候,它就不再读了(这是scanf的一个作用性质)。所以scanf就只取走了123456,而缓冲区中还剩下(空格) 789\n。

再往下,运行到:

getchar();

这行代码,然而这里只有一个getchar,它只能读取一个字符,也就是只读了空格,缓冲区中还剩789\n。

再往下,就是我们的这行代码:

int ch = getchar();

getchar()一来就取走了缓冲区中的7,根本不需要我们从键盘输入N或Y。运行时自然它就自动跳出了“确认错误”。

解决措施:

需要把缓冲区中的东西先全部清走。即:

//把缓冲区中的内容全读走
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的用法的实例解析。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号