C语言 scanf getchar() 键盘缓冲区

文章介绍了C语言中scanf函数的返回值规则,以及键盘输入如何与缓冲区交互。当输入不匹配时,未读取的字符会留在缓冲区中。通过示例代码解释了如何使用scanf和getchar处理这种情况,并提供了一道涉及输入检查的编程题来加深理解。

目录

一、scanf 的返回值

二、键盘缓冲区

三、题目


刚开始学,如果有不对的地方,欢迎指正。

之前在按照小甲鱼视频学C的时候,有一个课后题怎么看都看不懂,在多次搜索后,才慢慢搞懂,感觉到过去还是太过小看scanf getchar这些函数了,他们远比我想象得复杂。(因为课还没有听完,所以不知道这些是不是后面会教的,只能以我前面学习的内容去解释)

先是两个函数所用到的性质:

scanf():

int a=0,b=0,c=0;
b=scanf("%d %d",&a,&c);
printf("a=%d c=%d b=%d",a,b,c);

一、scanf 的返回值

scanf的返回值是成功赋给a值的次数,所以当在键盘上输入1 1时,输出的结果是

a=1 c=1 b=2即a c赋值成功,b是赋值成功的次数

当输入1 #时,输出的结果是a=1 c=0 b=1即,a赋值成功,c赋值失败,b赋值成功的次数为1次。

此时你是否会产生疑问,我们输入的#到哪里去了?

#此时储存在了键盘缓冲区

二、键盘缓冲区

我们从键盘输入的过程为:

调用scanf/getchar等这类函数>输入数据>储存到键盘缓冲区中>函数从键盘缓冲区里取你所输入的数据>进一步操作(比如scanf把数据赋值给变量)

我们由此设计一个程序去验证这个过程:

#include<stdio.h>
int main()
{
	int a=0;
	char b,c;
	scanf("%d",&a);
	b=getchar();
	c=getchar();
	printf(" a=%d\n b=%c\n c=%c\n",a,b,c);
}

当我们老老实实按照数据类型输入 整型数字字符字符时,输出自然是如你所想的

但是当我们输入$%^时的结果是什么?(三个字符)

是0%^。第一个0是我们声明变量的时候赋的值,scanf调用失败,此时scanf没有从键盘缓冲区里取数字,所以当前键盘缓冲区中是$%^,自然顺推把第一个$赋给了b,%赋给了c。键盘缓冲区内还剩一个^没有被取走

三、甲鱼为难人的题目

是第二个题目 

相信如果理解了上面的内容,下面这题对于我这种初学者来说最起码理解起来会顺畅很多。

答案为:

#include <stdio.h>

int main()
{
        float num = 0;
        double sum = 0;
        int status;

        do
        {
                printf("请输入合法的数字:");
                do
                {
                        sum = sum + num;
                        status = scanf("%f", &num);
                } while (getchar() != '\n' && status == 1);
        } while(status == 1);

        printf("结果是:%.2lf\n", sum);

        return 0;
}

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值