鱼C论坛

 找回密码
 立即注册
查看: 1232|回复: 2

[已解决]作业求助

[复制链接]
发表于 2021-4-1 00:02:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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时就自动退出循环?
最佳答案
2021-4-1 10:58:57
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 都不成立  就跳出去了,就没了,打印了,应该是这样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-1 10:46:10 | 显示全部楼层
以下是个人理解,如表达有误还请指出:

当输入 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,所以 外循环条件也不成立,退出外循环,即 程式运行结束
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-1 10:58:57 | 显示全部楼层    本楼为最佳答案   
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 都不成立  就跳出去了,就没了,打印了,应该是这样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 21:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表