作业求助
#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;
}请问各位大佬为什么这样做就可以当输入5a5时可以继续输入下下一个数字,而出现5aa5时就自动退出循环? 以下是个人理解,如表达有误还请指出:
当输入 5a5时
status = scanf("%f", &num); 会将数字 5 赋值给 num,而剩下的 a5还会继续保存在缓存区,此时scanf 返回值为 1即 status = 1
而后判断 while (getchar() != '\n' && status == 1); 此时 getchar() 会在缓存区获取到一个字符,也就是 a,数字5继续保留,判断条件成立,内循环继续
sum = sum + num;
status = scanf("%f", &num);内循环再次运行到这一步时,缓存区只剩下数字5,那么就会将5 赋值给num
再次判断内循环条件,while (getchar() != '\n' && status == 1);getchar() 此时从缓存区获取到 一个 换行符 '\n',内循环条件不成立,退出内循环
运行至外循环,此时status的值依然为1,外循环条件成立,循环开始
再次运行内循环,sum = sum + num; 会加上上次最后的数字
status = scanf("%f", &num);输入 5aa5,会先将第一个数字 5 赋值给 num,剩下的aa5保留在缓存区,scanf()返回值 为1,即 status = 1
判断内循环条件,while (getchar() != '\n' && status == 1);getchar()从缓存区获取一个字符a,只获取一个字符。剩下的 a5继续保留在缓存区
内循环条件成立,内循环继续
sum = sum + num;
status = scanf("%f", &num);再次运行至 赋值语句时,缓存区剩下 a5,将a赋值给num,但是a是字符,不符合num数据类型,赋值失败,scanf()返回值为0,即status = 0
内循环条件判断 while (getchar() != '\n' && status == 1); getchar() 从缓存区获取到字符,但是第二个条件 status = 0,所以条件不成立,退出内循环
运行至 外循环判断条件 while(status == 1);因为 status = 0,所以 外循环条件也不成立,退出外循环,即 程式运行结束 scanf的返回值若成功读入则返回1 未被成功读入 返回0
5a5 第一个5被成功读入, 返回值为1也就是status 为1 while (getchar() != '\n' && status == 1); 这个getchar() 从缓存区拿出字符a , (此时缓存区中还有个5,\n(回车)),不等于'\n', status 也为1 while条件满足
再进去 do(...)status = scanf("%f", &num); 此时把缓存区5成功读入,返回值1 ,此时缓存区还有个\n ,也就下面while 循环不成立 跳出,但status 还是为1的所以最外面的while 循环条件成立,再进外面do{...} 所以这就可以继续输入下一个数字
5aa5 status = scanf("%f", &num); ..... 依次会把第三个a读入,返回值为0未被成功读入,status 为 0 都不成立就跳出去了,就没了,打印了,应该是这样的
页:
[1]