LeafMount 发表于 2021-4-1 00:02:43

作业求助

#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时就自动退出循环?

LuLD 发表于 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,所以 外循环条件也不成立,退出外循环,即 程式运行结束

ljy5011 发表于 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 都不成立就跳出去了,就没了,打印了,应该是这样的
页: [1]
查看完整版本: 作业求助