鱼C论坛

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

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

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

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

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

x
关于第13行,为什么输入
7a8.8b9.9
后面的8.8不会覆盖前面的7,而是和前面的7相加呢?

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(void)
  4. {
  5.     float a, b;
  6.     int c;
  7.     do
  8.     {
  9.         printf("请输入合法的数字:");
  10.         do
  11.         {
  12.              a += b;
  13.             c = scanf("%f", &b);
  14.         } while (getchar() != '\n' && c == 1);

  15.     } while (c == 1);
  16.     printf("结果是:%.2f\n", a);
  17.     system("pause");
  18.     return 0;
  19. }
复制代码
最佳答案
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() 瞄准的又是一个新的浮点数。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

这是输出结果
uTools_1666244216174.png
小甲鱼最新课程 -> https://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 没有进行初始化,改过后,代码就完美了。
  1.     float a = 0 , b = 0 ; // 累加前,a 和 b 必须初始化为 0
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +6 鱼币

scanf获得浮点数,你打一个int整型,会被默认加上.0变为一个浮点值
小甲鱼最新课程 -> https://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就会是一个奇怪的值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-20 15:03:38 | 显示全部楼层
也就是当前面仅有一个%的时候,scanf函数只会录入一个浮点数吗
小甲鱼最新课程 -> https://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() 瞄准的又是一个新的浮点数。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +6 鱼币

啊这....挺神奇的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +6 鱼币

也许是的,遇到一个字符停止读入
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 07:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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