YiMingC 发表于 2019-3-19 21:53:54

关于scanf函数

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

代码如下,只有a的值可以被正常读取打印,不太理解为什么会这样。麻烦大家了。
#include <stdio.h>
main()
{
      long a,b;
      float x,y;
      scanf("%d,%d\n",&a,&b);
      scanf("%5.2f,%5.2f\n",&x,&y);
      printf("a= %d,b = %d\n",a,b);
      printf("x = %f,y = %f\n",x,y);
}

花椒壹拾伍 发表于 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);
}



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

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

https://fishc.com.cn/thread-67391-1-1.html

jackz007 发表于 2019-3-19 22:47:06

本帖最后由 jackz007 于 2019-3-19 22:49 编辑

scanf("%d %d %f %f" , & a , & b , & x , & y); // 整型占位符一般用 %d,浮点用 %f 即可,加域宽选项 %5.2f 纯属自找麻烦,因为如果格式不符就会导致非预期的结果,从而显著降低程序的宽容度。

YiMingC 发表于 2019-3-19 23:10:48

花椒壹拾伍 发表于 2019-3-19 22:19
#include
int main()
{


还有一个问题想问一下,

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

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

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

那为什么下图中红色区域加不加空格会有很大的结果差别呢?

冰封水3 发表于 2019-3-19 23:48:48

YiMingC 发表于 2019-3-19 23:10
还有一个问题想问一下,

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


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

本人小白一枚
见解仅供参考
欢迎大神多多指教

YiMingC 发表于 2019-3-20 07:59:04

冰封水3 发表于 2019-3-19 23:48
我是这样理解的:
“读取并忽略空白字符”应该指的是参数与参数之间的空白字符,
而你标注的红色区域位 ...

emmm,那它为什么多一个空格就可以实现上图的结果啊{:10_266:}

wp231957 发表于 2019-3-20 08:27:01

建议使用以下两种格式输入
scanf("%d%d%f%f" , & a , & b , & x , & y);使用空格隔开输入列表
scanf("%d,%d,%f,%f" , & a , & b , & x , & y);使用逗号隔开输入列表

sunrise085 发表于 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

冰封水3 发表于 2019-3-20 13:55:32

本帖最后由 冰封水3 于 2019-3-20 13:56 编辑

YiMingC 发表于 2019-3-20 07:59
emmm,那它为什么多一个空格就可以实现上图的结果啊

冰封水3 发表于 2019-3-20 14:12:15

具体的我就不清楚了
“字符串内不要加多余的空格或其他字母和标点,否则无法接收输入”
这是我最近看的一本书里关于scanf行的写法的一段说明

YiMingC 发表于 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,空格会把所有空白字符都对应吸走吗...{:5_96:}

sunrise085 发表于 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      123
输入方式3:a
               12                     3
等等,只要保证最前面只有一个char字符,后面可以有若干个空白符都可以,但是不能再出现数字以外的其他字符
总之一句话,%c前不能随便添加空白符需要和scanf中一致,%d和%f等数字类型之前可以添加任意空白符

YiMingC 发表于 2019-3-20 16:04:04

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

明白了 还有最后一个问题想问一下。
您看下图中的代码,两个scanf连用的时候,怎么算第一个scanf输入结束呢?
图中我输入了5个12,程序会自动把整形读取后转化成浮点型吗?
麻烦您了。

sunrise085 发表于 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赋值给了哪个变量。

编程就需要多尝试,摸索一会儿就知道里面的道道了。

YiMingC 发表于 2019-3-20 17:10:02

sunrise085 发表于 2019-3-20 16:22
哎,心好累。。。
你对scanf有误解啊。不知道你为什么要在scanf中添加回车字符。最开始你在scanf中添加 ...

明白了 谢谢大佬....
课本上的题,要求改错{:5_96:}
页: [1]
查看完整版本: 关于scanf函数