鱼C论坛

 找回密码
 立即注册
查看: 1813|回复: 8

[已解决]S1E14课后作业的问题

[复制链接]
发表于 2021-7-12 19:02:25 | 显示全部楼层 |阅读模式

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

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

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

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

最佳答案
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

懂了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-12 19:48:04 | 显示全部楼层
互换了就加了上一次非法的数据
scanf在下面就要进行判断
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-12 19:51:25 | 显示全部楼层
英文字母scanf录入不了呀
返回录入成功的个数 status == 0 不就结束了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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 ;的时候,程序不会停下来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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

懂了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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这个函数到底咋回事了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你应该看看getchar
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-12 22:28:49 | 显示全部楼层

程序是scanf取到5,下一个循环scanf取值的时候无法停止的,vs提示读取字符串字符时出错,我记得有一节课讲过scanf的停止条件,我去找找。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-28 10:11:43 | 显示全部楼层
万千只cnm 发表于 2021-7-12 21:58
都在缓冲区里呀。
1 2 3 4 5回车 (一共10个字符
scanf 1

看不懂誒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 10:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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