【C语言】scanf与getchar的区别

scanf返回值问题

scanf是有返回值的,返回的是读取到数据的个数,如果读取失败,则返回EOF。

EOF:end of file 文件结束的标志,其值为-1(可以自主尝试)

ok直接上代码证明

#include <stdio.h>
int main()
{
    int a = 0;
    int b = scanf("%d", &a);
    printf("%d", b);            //这里打印的是1。
    return 0;
}

这个时候伙伴们可能会问了,我们知道这个返回值有什么用?这其实是来解决你遇到多组输入的问题时候,可以更便利的写出我们的代码。我们以牛客题为例子

如上图,要求我们多组输入,并且每次输入都换一行,这个时候你知道scanf的返回值问题就可以很好的解决我们的多组输入问题了,你切记以后的多组输入问题,大致都是这个格式,即while(scanf()!=EOF)。

int main()
{
    int i = 0;
    int a = 0;
    int num = 0;
    while (scanf("%d", &num) == 1) //这里用!=EOF也可以哦
    {
        for (a = 0; a < num; a++)
        {
            printf("*");
        }
        printf("\n");               //实现每次输入一个光标就会换行等待
        i++;
    }
    return 0;
}
你会问了,只要我一直输入这个程序就会一直循环下去啊,为了解决这个,我们可以按3次CTRL+Z,为什么是3次? 我只能说别管问就是vs自带bug。当然了你vs需要自停,OJ不用管这个
你切记这个printf("\n");很重要,不信可以自敲代码感受。

getchar返回值问题

getchar读取的是一个字符(键盘上都可以看作字符),那为什么要用int类型返回呢,因为它返回的是ascll值。

读取字符然后返回ascll值,这说明了我们的char类型也算作整型里面的。

我们要输出getchar接收的东西,用putchar来输出。

int main()     
{
    int a = getchar();
    putchar(a);
    return 0;
}
如果我们的getchar读取失败,返回的是EOF--->-1

getchar的实际作用是清理缓冲区,哦?什么是缓冲区?

缓冲区(scanf与getchar工作过程)

我们的输入函数都不是直接从键盘里读取的,而是键盘输入后,放到缓冲区,输入函数们在缓冲里拿东西读取。你回想你在控制台里还没输入的时候,光标会一直闪烁,其实就是你的缓冲区里没有东西,它在等待你键盘输入到缓冲区。

你切记,scanf默认读取到空格就结束了

你看这题,是我之前写的求5个平均数的题目,如果不清楚的欢迎去看看我之前的文章哦

int main()
{
    int i = 0;
    float num = 0.0f;
    float sum = 0.0f;
    while (i < 5)
    {
        scanf("%f", &num);
        sum += num;
        i++;
    }
    printf("%.2f", sum / 5);
}

对于这个while循环,你可能会问,每次循环的开头我们要去输入一个数字,是不是我应该先输入一个数字,等它给个结果后会要求我们再输入一个数字?.... 其实不用这样,当我们了解到了scanf的工作内核后,你就会明白我们从键盘输入的数字并没有马上被scanf函数读取,而是先放到了缓冲区,所以我们可以一次性先把数字输入到缓冲区。如下图,我们输入一个数字空格再输入下一个数字(因为scanf默认读取到空格就结束了)第一个scanf在缓冲区拿到1结束,第二个拿到了2......

你可能会问了,那我这样输入呢

这个时候你的缓冲区:1\n2\n3\n4\n5\n,你的第一个scanf只读取一个数字,读到1的时候结束.....聪明如你,这个时候你就会明白这2种的区别。重点是借助缓冲区理解

getchar清理缓冲区实例

这里给个图片大家看一下,我相信彦祖们一定知道我这代码过程是什么与想干什么

这里你会问了,woc我都没输入Y与N它为什么直接给我来了一个NO?
你切记: 这是因为我们输入密码123后回车,这个时候你的缓冲区就是这样的: 123\n
我们的123被scanf拿走,ok遇到getchar了,缓冲区里只有 \n
注意!!!你的\n是转义字符 字符 字符!
\n就会被getchar拿走,然后进入我们的循环语句,a=Y吗?不等于就进入else语句直接输出no
思考 下面这样输入为什么也直接输出no?

这里之所以没有达到我们想要的东西,是因为在遇到getchar的时候你的缓冲区还有东西。要解决这个东西,就需要我们的getchar循环清理掉我们的缓冲区,方便读取我们的Y与N

while (getchar() != '\n')        //如果你!=EOF的话你的全部值都要被拿走,并不会跳出你输入Y也拿走
   {
        ;
    }
思考 这里想想为什么是!='\n'的而不是我们的!=EOF
思考 为什么我们要用循环来清理缓冲区

ok,事已至此,我们上我们的最终代码

int main()
{
    int a = 0;
    char password[20] = { 0 };
    printf("请输入你的密码: ");
    scanf("%s", password);
    printf("Y/N: ");
    while (getchar() != '\n')        //如果你!=EOF的话你的全部值都要被拿走,并不会跳出你输入Y也拿走
    {
        ;
    }
    a = getchar();
    if (a == 'Y')
    {
        printf("ok");
    }
    else
    {
        printf("no");
    }
}

各位彦祖们,现在可以试一下刚才我们遇到的问题现在是不是完美解决了

输入12空格3

输入 123回车

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值