鱼C论坛

 找回密码
 立即注册
查看: 1213|回复: 10

[已解决]小学鸡的疑问:s1e14.为什么通过那一步就做到了多个数字的输入?

[复制链接]
发表于 2020-9-5 23:27:49 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>
int main()
{
        float num=0,sum=0,flag;
        do{
                        printf("请输入合法的数字:\n");
                do
                {
                        sum=sum+num;

                        flag=scanf("%f",&num);

                }while(flag==1&&getchar()!='\n');//???
        }while(flag==1);
        printf("正确的输入和为%f",sum);
        return 0;
}
最佳答案
2020-9-6 11:14:27
greenery 发表于 2020-9-6 09:34
谢谢你,scanf函数我懂了,我还想知道getchar()!=‘\n’这个点是怎么做到单行输入多个数据 ...

      在输入回车 '\n' 之前,键盘输入的字符都存到缓冲区内,一旦键入回车,getchar就进入缓冲区读取字符,一次只返回一个字符作为 getchar() 函数的值(每一次只读取一个字符),如果循环体内的 getchar() 语句有足够多的循环次数或者循环体外足够多的 getchar() 语句,就会依次读出缓冲区内的所有字符直到回车 '\n'。

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2020-9-6 00:33:47 | 显示全部楼层
因为不明白你在说什么,我购买了S1E13,没有看到你的问题,“S1E14 是:for语句和循环嵌套 | 课后测试题及答案” 更不可能是你要说的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-6 00:51:52 | 显示全部楼层
风过无痕1989 发表于 2020-9-6 00:33
因为不明白你在说什么,我购买了S1E13,没有看到你的问题,“S1E14 是:for语句和循环嵌套 | 课后测试题及 ...

抱歉啊,我也找不到了
就是说通过多加一层do while循环就能实现在一条“请输入合法的数字:”后面输入多个float型。
我想知道是怎么做到的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-6 00:57:10 | 显示全部楼层
风过无痕1989 发表于 2020-9-6 00:33
因为不明白你在说什么,我购买了S1E13,没有看到你的问题,“S1E14 是:for语句和循环嵌套 | 课后测试题及 ...

就这个的第一行
捕获.JPG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-6 08:48:25 | 显示全部楼层
scanf函数返回成功读入的数据项数,读入数据时遇到了“文件结束”则返回EOF。
如: scanf( %d%d ,&a,&b); 函数返回值为int型。如果a和b都被成功读入,那么scanf的返回值就是2; 如果只有a被成功读入,返回值为1; 如果a和b都未被成功读入,返回值为0;
#include <stdio.h>
int main()
{
        float num=0,sum=0,flag;
        do{
                        printf("请输入合法的数字:\n");
                do
                {
                        sum=sum+num;

                        flag=scanf("%f",&num); //如果成功读入,flag为1 

                }while(flag==1&&getchar()!='\n');//结束条件是flag为1并且下一个输入的为空格,结束里面do-while 
        }while(flag==1); //当成功读入,继续循环 
        printf("正确的输入和为%f",sum);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-6 09:05:54 | 显示全部楼层
新手看不懂啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-6 09:34:11 | 显示全部楼层
巴巴鲁 发表于 2020-9-6 08:48
scanf函数返回成功读入的数据项数,读入数据时遇到了“文件结束”则返回EOF。
如: scanf( %d%d ,&a,&b);  ...

谢谢你,scanf函数我懂了,我还想知道getchar()!=‘\n’这个点是怎么做到单行输入多个数据的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-6 10:23:20 | 显示全部楼层
本帖最后由 巴巴鲁 于 2020-9-6 10:25 编辑
greenery 发表于 2020-9-6 09:34
谢谢你,scanf函数我懂了,我还想知道getchar()!=‘\n’这个点是怎么做到单行输入多个数据 ...


我以为解释清楚了...
如果你输入回车结束里面的循环,也就是下一个会显示请输入合法数字(因为结束了里面的do-while)
但是你如果输入空格,tab键,可以继续输入数字,并将输入的数字会进行累加
就像你发的那个运行结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-6 11:14:27 | 显示全部楼层    本楼为最佳答案   
greenery 发表于 2020-9-6 09:34
谢谢你,scanf函数我懂了,我还想知道getchar()!=‘\n’这个点是怎么做到单行输入多个数据 ...

      在输入回车 '\n' 之前,键盘输入的字符都存到缓冲区内,一旦键入回车,getchar就进入缓冲区读取字符,一次只返回一个字符作为 getchar() 函数的值(每一次只读取一个字符),如果循环体内的 getchar() 语句有足够多的循环次数或者循环体外足够多的 getchar() 语句,就会依次读出缓冲区内的所有字符直到回车 '\n'。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-9-15 18:49:12 | 显示全部楼层
      举个例子,程序运行,先提示你输入合法的数组,你输入11,12回车,那么这些都是先存放在缓冲区里的,然后内部循环先执行sum = sum + num(等于0),之后scanf先读取到11放到num里,然后getchar会读取到,(会将缓冲区的,拿走)然后判断是否等于回车,不等于回车且sanf读取成功则继续循环,sum = sum + num(等于11)此时缓冲区还剩下一个12和一个回车,然后sanf读取到12,放到num里,getchar读取到回车不满足内部循环条件,结束内部循环,但此时flag还是1,满足外部循环条件,又进入了循环,再一次的提示你输入合法的数字(然后你输入了另一组数字放在缓冲区),然后内部循环开始执行sum = sum + num(此时num存放的是12,所以结果等于23),再通过scanf读取到你输入的数据,getchar()获取字符在进行新一轮的判断。
      但getchar()每次只能获取一个字符,所以如果一开始你输入11,,12回车,那么你会发现程序直接结束,结果是11,没有加12,那是因为一开始scanf读取到11,读取成功返回1,然后getchar()读取到,(此时缓冲区剩下,12)满足内部循环条件,进行循环,执行sum = sum + num(等于11),但之后scanf会读取到,读取失败返回值0不满足内部循环条件,退出内部循环,同时也不满足外部循环条件,退出外部循环,打印结果11
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-9-15 20:51:22 | 显示全部楼层
gy1768532 发表于 2020-9-15 18:49
举个例子,程序运行,先提示你输入合法的数组,你输入11,12回车,那么这些都是先存放在缓冲区里的, ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 03:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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