amadboy2009 发表于 2021-7-12 19:02:25

S1E14课后作业的问题

#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;
}

小甲鱼最后问了个开放性问题
sum = sum + num;
status = scanf("%f", &num);
为什么这两条语句交换顺序则会出现错误我试了下,不止这两句交换会发生问题,你输入的字符串最后如果不是数字,是空格会出现换行,是英文字母会出现直接计算结果而不会进行循环想
①问下为什么?
②怎么优化?

万千只cnm 发表于 2021-7-12 19:48:04

互换了就加了上一次非法的数据
scanf在下面就要进行判断

万千只cnm 发表于 2021-7-12 19:51:25

英文字母scanf录入不了呀
返回录入成功的个数 status == 0 不就结束了

amadboy2009 发表于 2021-7-12 21:33:57

万千只cnm 发表于 2021-7-12 19:51
英文字母scanf录入不了呀
返回录入成功的个数 status == 0 不就结束了

没看明白,不互换的情况下,反汇编看了一下,如果我输入初次1 2 3 4 5,getchar()函数是没有扫到过1的,取到的第一个值是0x20,也就是空格,所以getchar()取到’\n’的时候,scanf()扫到的这个5没加上,然后做了一次大循环,第二次才加上这个5。。。getchar()这个函数要把我整蒙了
等于整个过程是:如果我输入1 2 3 4 5\n;
1、scanf取到num=1,getchar()=空格,然后sum相加一次
2、scanf取到num=2,getchar()=空格
。。。
N、scanf取到了num=5,getchar()=‘\n',此时退出内循环
返回大循环,然后修改sum一次,此时1,2,3,4,5才相加完毕。。
等于这个getchar()从来没扫到过一个数字,我猜scanf和getchar应该是scanf取到的值getchar不选取,选取下一个,这个能解释大部分问题。
但是还有一个问题,但是为啥结尾是空格的时候无法停止运行呢。。。。。就是说如果你输入1 2 3 4 5 ;的时候,程序不会停下来

万千只cnm 发表于 2021-7-12 21:58:48

都在缓冲区里呀。
1 2 3 4 5回车 (一共10个字符
scanf 1
getchar 空格
(getchar() != '\n' && status == 1) == 1--》继续里层do while

然后循环 往复
scanf 1,2,3,4,5
getchar 空格空格空格空格回车
(getchar() != '\n' && status == 1)   getchar读取到回车不是空格 为0 跳出内循环 外部dowhile

懂了吗{:5_104:}

amadboy2009 发表于 2021-7-12 22:16:42

万千只cnm 发表于 2021-7-12 21:58
都在缓冲区里呀。
1 2 3 4 5回车 (一共10个字符
scanf 1


其实这个自己试出来了。。感谢确认,但是现在又来了个问题,为啥我输入1 2 3 4 5 ;即1空格2空格3空格4空格5空格,的时候这个程序为啥停不下了,猜测是scanf读取完了5之后,多了一个空格,所以getchar()读取到了空格而不是回车,然后再次内循环,然后scanf往下扫没有正确的值了。现在在研究scanf这个函数到底咋回事了。

万千只cnm 发表于 2021-7-12 22:21:33

amadboy2009 发表于 2021-7-12 22:16
其实这个自己试出来了。。感谢确认,但是现在又来了个问题,为啥我输入1 2 3 4 5 ;即1空格2空格3空格4空 ...

你应该看看getchar

amadboy2009 发表于 2021-7-12 22:28:49

万千只cnm 发表于 2021-7-12 22:21
你应该看看getchar

程序是scanf取到5,下一个循环scanf取值的时候无法停止的,vs提示读取字符串字符时出错,我记得有一节课讲过scanf的停止条件,我去找找。

三刀流.索隆 发表于 2021-7-28 10:11:43

万千只cnm 发表于 2021-7-12 21:58
都在缓冲区里呀。
1 2 3 4 5回车 (一共10个字符
scanf 1


看不懂誒{:10_266:}
页: [1]
查看完整版本: S1E14课后作业的问题