鱼C论坛

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

[已解决]关于scanf函数的问题

[复制链接]
发表于 2022-10-20 13:32:46 | 显示全部楼层 |阅读模式

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

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

x
关于第13行,为什么输入
7a8.8b9.9
后面的8.8不会覆盖前面的7,而是和前面的7相加呢?
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    float a, b;
    int c;
    do
    {
        printf("请输入合法的数字:");
        do
        { 
             a += b;
            c = scanf("%f", &b);
        } while (getchar() != '\n' && c == 1);

    } while (c == 1);
    printf("结果是:%.2f\n", a);
    system("pause");
    return 0;
}
最佳答案
2022-10-20 15:10:34
本帖最后由 jackz007 于 2022-10-20 15:12 编辑
1613551 发表于 2022-10-20 15:03
也就是当前面仅有一个%的时候,scanf函数只会录入一个浮点数吗


        是的,字符串里有一个"%f" ,同时,后面有一个 & b 与之相对应,每次就会只读取一个浮点数。
        对于同一行输入的 7a8.8b9.9 而言,会分 3 次读取 3 个浮点数。scanf() 每次在读取到不属于浮点数的字符之前会自动停止,后面 while 语句中的 getchar() 会读取这个字符,下一次 scanf() 瞄准的又是一个新的浮点数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-10-20 13:34:53 | 显示全部楼层
本帖最后由 1613551 于 2022-10-20 13:37 编辑

这是输出结果
uTools_1666244216174.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-20 14:01:59 | 显示全部楼层

回帖奖励 +6 鱼币

本帖最后由 jackz007 于 2022-10-20 14:32 编辑

        因为在每次 scanf() 读入新的 b 之前,都先执行了 a = a + b,就是说,b 已经被记录到 a 当中了,因此,不会被覆盖。
        问题出在第 5 行,累加变量 a 和 b 没有进行初始化,改过后,代码就完美了。
    float a = 0 , b = 0 ; // 累加前,a 和 b 必须初始化为 0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-20 14:36:27 | 显示全部楼层

回帖奖励 +6 鱼币

scanf获得浮点数,你打一个int整型,会被默认加上.0变为一个浮点值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-20 15:02:16 | 显示全部楼层
jackz007 发表于 2022-10-20 14:01
因为在每次 scanf() 读入新的 b 之前,都先执行了 a = a + b,就是说,b 已经被记录到 a 当中了, ...

我以为scanf会一次性把7a8.8b9.9都传入到c里面,那么c就会是一个奇怪的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-20 15:03:38 | 显示全部楼层
也就是当前面仅有一个%的时候,scanf函数只会录入一个浮点数吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-20 15:10:34 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +6 鱼币

本帖最后由 jackz007 于 2022-10-20 15:12 编辑
1613551 发表于 2022-10-20 15:03
也就是当前面仅有一个%的时候,scanf函数只会录入一个浮点数吗


        是的,字符串里有一个"%f" ,同时,后面有一个 & b 与之相对应,每次就会只读取一个浮点数。
        对于同一行输入的 7a8.8b9.9 而言,会分 3 次读取 3 个浮点数。scanf() 每次在读取到不属于浮点数的字符之前会自动停止,后面 while 语句中的 getchar() 会读取这个字符,下一次 scanf() 瞄准的又是一个新的浮点数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-21 06:51:56 | 显示全部楼层

回帖奖励 +6 鱼币

啊这....挺神奇的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-21 06:52:52 | 显示全部楼层

回帖奖励 +6 鱼币

也许是的,遇到一个字符停止读入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 11:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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