1613551 发表于 2022-10-20 13:32:46

关于scanf函数的问题

关于第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;
}

1613551 发表于 2022-10-20 13:34:53

本帖最后由 1613551 于 2022-10-20 13:37 编辑

这是输出结果

jackz007 发表于 2022-10-20 14:01:59

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

      因为在每次 scanf() 读入新的 b 之前,都先执行了 a = a + b,就是说,b 已经被记录到 a 当中了,因此,不会被覆盖。
      问题出在第 5 行,累加变量 a 和 b 没有进行初始化,改过后,代码就完美了。
    float a = 0 , b = 0 ; // 累加前,a 和 b 必须初始化为 0

homeskating 发表于 2022-10-20 14:36:27

scanf获得浮点数,你打一个int整型,会被默认加上.0变为一个浮点值

1613551 发表于 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就会是一个奇怪的值

1613551 发表于 2022-10-20 15:03:38

也就是当前面仅有一个%的时候,scanf函数只会录入一个浮点数吗

jackz007 发表于 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() 瞄准的又是一个新的浮点数。

zhangjinxuan 发表于 2022-10-21 06:51:56

啊这....挺神奇的

zhangjinxuan 发表于 2022-10-21 06:52:52

也许是的,遇到一个字符停止读入
页: [1]
查看完整版本: 关于scanf函数的问题