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);
为什么这两条语句交换顺序则会出现错误我试了下,不止这两句交换会发生问题,你输入的字符串最后如果不是数字,是空格会出现换行,是英文字母会出现直接计算结果而不会进行循环想
①问下为什么?
②怎么优化?
互换了就加了上一次非法的数据
scanf在下面就要进行判断 英文字母scanf录入不了呀
返回录入成功的个数 status == 0 不就结束了 万千只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 ;的时候,程序不会停下来 都在缓冲区里呀。
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:} 万千只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这个函数到底咋回事了。 amadboy2009 发表于 2021-7-12 22:16
其实这个自己试出来了。。感谢确认,但是现在又来了个问题,为啥我输入1 2 3 4 5 ;即1空格2空格3空格4空 ...
你应该看看getchar 万千只cnm 发表于 2021-7-12 22:21
你应该看看getchar
程序是scanf取到5,下一个循环scanf取值的时候无法停止的,vs提示读取字符串字符时出错,我记得有一节课讲过scanf的停止条件,我去找找。 万千只cnm 发表于 2021-7-12 21:58
都在缓冲区里呀。
1 2 3 4 5回车 (一共10个字符
scanf 1
看不懂誒{:10_266:}
页:
[1]