鱼C论坛

 找回密码
 立即注册
查看: 2740|回复: 14

[已解决]关于scanf函数

[复制链接]
发表于 2019-3-19 21:53:54 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 YiMingC 于 2019-3-19 21:57 编辑

代码如下,只有a的值可以被正常读取打印,不太理解为什么会这样。麻烦大家了。
  1. #include <stdio.h>
  2. main()
  3. {
  4.         long a,b;
  5.         float x,y;
  6.         scanf("%d,%d\n",&a,&b);
  7.         scanf("%5.2f,%5.2f\n",&x,&y);
  8.         printf("a= %d,b = %d\n",a,b);
  9.         printf("x = %f,y = %f\n",x,y);
  10. }
复制代码
最佳答案
2019-3-20 16:22:30
YiMingC 发表于 2019-3-20 16:04
明白了 还有最后一个问题想问一下。
您看下图中的代码,两个scanf连用的时候,怎么算第一个scanf输入结 ...

哎,心好累。。。
你对scanf有误解啊。不知道你为什么要在scanf中添加回车字符。最开始你在scanf中添加浮点数长度位数限制,又添加回车字符,你为什么要写这些呢?加逗号也就忍了,居然添加这种字符。。。
本来只需要输入四个12,结果你则需要输入五个12.。。。。就因为你在scanf中写了"\n"。。。你的第三个12可以不写,直接回车。

说一下你这五个12,吧。第一个12 之后有个回车,这是系统认为第一个数字输入结束了,将12赋值给变量a,把回车当做了分隔符,第二个12一样,回车被当做分隔符,把第二个12赋值给变量b,
之后就在等待你输入回车"/n",但是你没有输入回车,而是输入了12,系统没检测到就等着呗,第三个12之后输入回车,系统检测到了!然后才执行下一个scanf……

你可以试着输入不同的数字就可以看出运行过程了,都是12 ,看不出来哪个12赋值给了哪个变量。

编程就需要多尝试,摸索一会儿就知道里面的道道了。
60_4.2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-19 22:19:21 | 显示全部楼层
本帖最后由 花椒壹拾伍 于 2019-3-19 22:31 编辑

#include <stdio.h>
int main()
{
        long a,b;
        float x,y;
        scanf("%d,%d,%5f,%5f",&a,&b,&x,&y);
        printf("a= %d,b = %d\n",a,b);
        printf("x = %5.2f,y = %5.2f\n",x,y);
}

微信图片_20190319222603.png

你多看看函数快查里的scanf的文档,你写 %5.2f 这样的明显就是错的,不能正常输入也没什么奇怪。

还有就是你 %d,%d 这样中间是有逗号的,那你输入的时候就得打逗号,要不不能正确输入的。或者你把逗号去了,输入的时候用空格隔开也行。

https://fishc.com.cn/thread-67391-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-19 22:47:06 | 显示全部楼层
本帖最后由 jackz007 于 2019-3-19 22:49 编辑
  1. scanf("%d %d %f %f" , & a , & b , & x , & y)  ; // 整型占位符一般用 %d,浮点用 %f 即可,加域宽选项 %5.2f 纯属自找麻烦,因为如果格式不符就会导致非预期的结果,从而显著降低程序的宽容度。
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-19 23:10:48 | 显示全部楼层

还有一个问题想问一下,

函数快查中对scanf有这样一段描述:

“该格式化字符串指定如何处理读取到的数据:

空白字符:该函数将读取并忽略空白字符(空白字符包含空格、回车和制表符);”

那为什么下图中红色区域加不加空格会有很大的结果差别呢?
123.png
加空格.png
没加空格.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-19 23:48:48 | 显示全部楼层
YiMingC 发表于 2019-3-19 23:10
还有一个问题想问一下,

函数快查中对scanf有这样一段描述:

我是这样理解的:
“读取并忽略空白字符”应该指的是参数与参数之间的空白字符,
而你标注的红色区域位于字符串内,属于参数的内容
此处空白字符的有无应该会对参数本身产生影响。

本人小白一枚
见解仅供参考
欢迎大神多多指教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-20 07:59:04 From FishC Mobile | 显示全部楼层
冰封水3 发表于 2019-3-19 23:48
我是这样理解的:
“读取并忽略空白字符”应该指的是参数与参数之间的空白字符,
而你标注的红色区域位 ...

emmm,那它为什么多一个空格就可以实现上图的结果啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-20 08:27:01 | 显示全部楼层
建议使用以下两种格式输入
scanf("%d%d%f%f" , & a , & b , & x , & y)  ;  使用空格隔开输入列表
scanf("%d,%d,%f,%f" , & a , & b , & x , & y)  ;  使用逗号隔开输入列表
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-20 10:15:43 | 显示全部楼层
YiMingC 发表于 2019-3-19 23:10
还有一个问题想问一下,

函数快查中对scanf有这样一段描述:

scanf跳过空白符主要是针对字符以外的其他格式,因为空格也是一种char类型,所以用scanf输入%c的时候需要留意,scanf中是什么格式你就需要输入什么格式,否则就可能会出现你所遇到的问题,空白符被读进%c了,进而导致下一个%d也读取错误。
假如scanf中连续读取两个%d,name这俩数字之间你写多少个空白符都没关系
就看你这句程序
scanf("%d%c%d",&data1,&op,&data2);
若输入以下内容是没问题的:
12+                          

1
结果依然不会出错,因为一个%d读取到了12,接下来的%c读取到了+,读取最后一个%d时遇到了很多空白符,就直接忽略了,所以data2能够读取到1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-20 13:55:32 | 显示全部楼层
本帖最后由 冰封水3 于 2019-3-20 13:56 编辑
YiMingC 发表于 2019-3-20 07:59
emmm,那它为什么多一个空格就可以实现上图的结果啊


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

使用道具 举报

发表于 2019-3-20 14:12:15 | 显示全部楼层
具体的我就不清楚了
“字符串内不要加多余的空格或其他字母和标点,否则无法接收输入”
这是我最近看的一本书里关于scanf行的写法的一段说明
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-20 15:25:23 | 显示全部楼层
本帖最后由 YiMingC 于 2019-3-20 15:41 编辑
sunrise085 发表于 2019-3-20 10:15
scanf跳过空白符主要是针对字符以外的其他格式,因为空格也是一种char类型,所以用scanf输入%c的时候需要 ...


请问一下在scanf()里面加空格是什么原理啊...比如输入12        +1,空格会把所有空白字符都对应吸走吗...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-20 15:58:28 | 显示全部楼层
YiMingC 发表于 2019-3-20 15:25
请问一下在scanf()里面加空格是什么原理啊...比如输入12        +1,空格会把所有空白字符都对应吸走 ...

不是的。scanf中有%c则需要连续输入,不能有任何空白符,因为空白符也会被当做char传递给%c所对应的的变量。
例如:
scanf("%d,%c,%c",&a,&b,&c);   需要输入:12,a,f   scanf中三个%之间各有一个逗号,所以输入中也需要有逗号,这样才能是三个变量都对应起来
scanf("%d %c %c",&a,&b,&c);   需要输入:12 a f    scanf中三个%之间各有一个空格,所以输入中也需要有空格,这样才能是三个变量都对应起来
scanf("%c%d%d",&a,&b,&c);  输入就没必要这么严格,只要保证第一个字符是char,后面的两个int之间可以添加任意空白符,
例如:
输入方式1:a12 3   (12和3之间有一个空格)
输入方式2:a        12  3
输入方式3:a
                 12                       3
等等,只要保证最前面只有一个char字符,后面可以有若干个空白符都可以,但是不能再出现数字以外的其他字符
总之一句话,%c前不能随便添加空白符需要和scanf中一致,%d和%f等数字类型之前可以添加任意空白符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-20 16:04:04 | 显示全部楼层
sunrise085 发表于 2019-3-20 15:58
不是的。scanf中有%c则需要连续输入,不能有任何空白符,因为空白符也会被当做char传递给%c所对应的的变 ...

明白了 还有最后一个问题想问一下。
您看下图中的代码,两个scanf连用的时候,怎么算第一个scanf输入结束呢?
图中我输入了5个12,程序会自动把整形读取后转化成浮点型吗?
麻烦您了。
1 2.png
1 1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-20 16:22:30 | 显示全部楼层    本楼为最佳答案   
YiMingC 发表于 2019-3-20 16:04
明白了 还有最后一个问题想问一下。
您看下图中的代码,两个scanf连用的时候,怎么算第一个scanf输入结 ...

哎,心好累。。。
你对scanf有误解啊。不知道你为什么要在scanf中添加回车字符。最开始你在scanf中添加浮点数长度位数限制,又添加回车字符,你为什么要写这些呢?加逗号也就忍了,居然添加这种字符。。。
本来只需要输入四个12,结果你则需要输入五个12.。。。。就因为你在scanf中写了"\n"。。。你的第三个12可以不写,直接回车。

说一下你这五个12,吧。第一个12 之后有个回车,这是系统认为第一个数字输入结束了,将12赋值给变量a,把回车当做了分隔符,第二个12一样,回车被当做分隔符,把第二个12赋值给变量b,
之后就在等待你输入回车"/n",但是你没有输入回车,而是输入了12,系统没检测到就等着呗,第三个12之后输入回车,系统检测到了!然后才执行下一个scanf……

你可以试着输入不同的数字就可以看出运行过程了,都是12 ,看不出来哪个12赋值给了哪个变量。

编程就需要多尝试,摸索一会儿就知道里面的道道了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-20 17:10:02 | 显示全部楼层
sunrise085 发表于 2019-3-20 16:22
哎,心好累。。。
你对scanf有误解啊。不知道你为什么要在scanf中添加回车字符。最开始你在scanf中添加 ...

明白了 谢谢大佬....
课本上的题,要求改错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 22:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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