鱼C论坛

 找回密码
 立即注册
查看: 2397|回复: 5

[已解决]小甲鱼的S1E14:for语句和循环嵌套有个问题

[复制链接]
发表于 2021-3-31 22:44:02 | 显示全部楼层 |阅读模式
30鱼币
#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;
}
就是那个scanf的运行原理还是没看懂,为啥我输入可以是"2a3b4c5d\n"中间可以用字母将这些数字分开呢,如果是一个一个读取,不是读取到中间的字母的时候status就应该变为0然后直接退出吗。、

然后如果我输入中间多了几个字母就是直接输出结果,比如说"2aaaA33d"这样就会直接输出sum为2,就是按照结果来说sum应该是2而不是14啊。

然后那个getchar()是我输入的内容"2a3b4c5d\n"每个字符都会检测是不是换行符吗。如果检测到换行符就退出里面那个循环的意思吗。。。看的我有点晕
最佳答案
2021-3-31 22:44:03
scanf("%d %d",&a,&b);
函数返回值为int型。如果a和b都被成功读入,那么scanf的返回值就是2;
如果只有a被成功读入,返回值为1;
如果a读取失败,返回值为0;


输入"2a3b4c5d\n"

循环1:
// "2a3b4c5d\n"
            status = scanf("%f", &num); // 成功读取 2, status==1,缓冲区字符剩"a3b4c5d\n"
                } while (getchar() != '\n' && status == 1); // getchar()把"a"取出 "a" != '\n' and status == 1 继续这层循环 缓冲区字符剩"3b4c5d\n"
        } while(status == 1);

循环2:
// 缓冲区 "3b4c5d\n"
            status = scanf("%f", &num); // 成功读取 3,status==1,缓冲区字符剩"b4c5d\n"
                } while (getchar() != '\n' && status == 1); // getchar()把"b"取出 "b" != '\n' and status == 1 继续这层循环 缓冲区字符剩"4c5d\n"
        } while(status == 1)


........

最佳答案

查看完整内容

scanf("%d %d",&a,&b); 函数返回值为int型。如果a和b都被成功读入,那么scanf的返回值就是2; 如果只有a被成功读入,返回值为1; 如果a读取失败,返回值为0; 输入"2a3b4c5d\n" 循环1: // "2a3b4c5d\n" status = scanf("%f", &num); // 成功读取 2, status==1,缓冲区字符剩"a3b4c5d\n" } while (getchar() != '\n' && status == 1); // getchar()把"a"取出 "a" != '\n' and status == ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-31 22:44:03 | 显示全部楼层    本楼为最佳答案   
scanf("%d %d",&a,&b);
函数返回值为int型。如果a和b都被成功读入,那么scanf的返回值就是2;
如果只有a被成功读入,返回值为1;
如果a读取失败,返回值为0;


输入"2a3b4c5d\n"

循环1:
// "2a3b4c5d\n"
            status = scanf("%f", &num); // 成功读取 2, status==1,缓冲区字符剩"a3b4c5d\n"
                } while (getchar() != '\n' && status == 1); // getchar()把"a"取出 "a" != '\n' and status == 1 继续这层循环 缓冲区字符剩"3b4c5d\n"
        } while(status == 1);

循环2:
// 缓冲区 "3b4c5d\n"
            status = scanf("%f", &num); // 成功读取 3,status==1,缓冲区字符剩"b4c5d\n"
                } while (getchar() != '\n' && status == 1); // getchar()把"b"取出 "b" != '\n' and status == 1 继续这层循环 缓冲区字符剩"4c5d\n"
        } while(status == 1)


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

使用道具 举报

 楼主| 发表于 2021-4-1 09:12:46 | 显示全部楼层
ba21 发表于 2021-3-31 23:08
scanf("%d %d",&a,&b);
函数返回值为int型。如果a和b都被成功读入,那么scanf的返回值就是2;
如果只有a ...

还有个问题那如果我是中间有很多空格呢,比如“1     +5”,为啥getchar能一次性识别这么多空格还有一个加号吗。。getchar不是只读一个字符吗。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-1 10:00:01 | 显示全部楼层
ba21 发表于 2021-3-31 22:44
scanf("%d %d",&a,&b);
函数返回值为int型。如果a和b都被成功读入,那么scanf的返回值就是2;
如果只有a ...

上一个问题弄明白啦- -原来是个正号的意思。。还有一个问题。。我这样输入"1          6          "尤其是最后有一大堆空格scanf是怎么识别那6以后的空格
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-1 10:15:02 | 显示全部楼层
wtfitis 发表于 2021-4-1 10:00
上一个问题弄明白啦- -原来是个正号的意思。。还有一个问题。。我这样输入"1          6          "尤其 ...

C语言除了用%c读取char型单字符不会跳过空格(这里的空格包括:空格、制表符、跟回车键一起被键入的换行符),其他的格式说明符:如%s字符串,%d整型,%ld长整型,%hd短整型,%f单精度浮点型,%lf双精度浮点型,%Lf长双精度浮点型等等都会跳过所有前缀空格,直到遇到第一个非空格字符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-1 11:08:12 | 显示全部楼层
wtfitis 发表于 2021-4-1 10:00
上一个问题弄明白啦- -原来是个正号的意思。。还有一个问题。。我这样输入"1          6          "尤其 ...

scanf 忽略1个或多个空格。
百度先仔细 看看scanf的用法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 01:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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