目录
刚开始学,如果有不对的地方,欢迎指正。
之前在按照小甲鱼视频学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;
}
文章介绍了C语言中scanf函数的返回值规则,以及键盘输入如何与缓冲区交互。当输入不匹配时,未读取的字符会留在缓冲区中。通过示例代码解释了如何使用scanf和getchar处理这种情况,并提供了一道涉及输入检查的编程题来加深理解。
1065





