</pre>第一次写带图片的,粘贴上去的,之后就没了。。我也是醉了。。。。。
按照惯例先来说说自己想写这个博客的原因哈,今天看小甲鱼的C++视频,他出了一道题目输入为:123 123 2 3 1 ....,输出这些数字的和,但是这里数字之间存在很多空格,所以要能过滤空格,实现代码
<span style="white-space:pre"> </span>int i,sum=0;
char ch;
printf("输入多个整数以空格隔开: ");
while(scanf("%d",&i)!=0)
{
sum=sum+i;
ch=getchar();
if(ch=='\n')
break;
//ungetc(ch,stdin);
}
printf("求和的结果为%d\n",sum);
return 0;
这让我不得不思考下scanf是怎么接受输入的,所以就去百度scanf的原理。然后看了一些,自己做了个小小的总结探索。
若是有错误的地方请指点。
1.下面是我探索的代码,主要是看看scanf的返回值(不是不想直接看函数原型,喜欢这种先自己探索下,然后再看,比较容易接受,函数原型后面给出)
#include <stdio.h>
#include <stdlib.h>
/****
*****/
int main()
{
/**************test1**********************************/
#if 1
int a,i;
a=scanf("%d",&i);
printf("i=%d a=%d\n",i,a);
return 0;
#endif // 1
/**************test2**********************************/
#if 0
int a,i,j;
a=scanf("%d %d",&i,&j);
printf("i=%d j=%d a=%d\n",i,j,a);
return 0;
#endif // 0
/**************华丽丽的分割线**********************************/
#if 0
int i,sum=0;
char ch;
printf("输入多个整数以空格隔开: ");
while(scanf("%d",&i)!=0)
{
sum=sum+i;
ch=getchar();
if(ch=='\n')
break;
//ungetc(ch,stdin);
}
printf("求和的结果为%d\n",sum);
return 0;
#endif // 0
}
测试scanf的返回值发现:
1.scanf("%d",&i);
输入
输出
2.scanf("%d %d",&i,&j)
输入:
输出:
test1:i是输入数据,格式为"%d"也就是整型 ,a是scanf()函数返回值
这里按照标准格式输入,返回值为 1
由以上多个例子可以看出,由于标准格式为"%d",scanf()在读取时只读取前面跟格式匹配的数值(着属于我自己试验的结果,不能确定是否属实,所以我下面把标准格式换为“%f”试试)
更多的数据告诉我,确实如此(上面的输入数据都是开始的 数据满足标准格式时的试验,下面我看看开始的数据就不满足时{做一个调皮的用户,违法输入})
这里因为是违法输入,返回值为0,并且,当是违法输入时,整型时其值为58(这里不知道是什么原因)。而浮点型为 0.000000 (这里我测试过多例子)
接下来我要测试的是多个输入时
正常输入
返回值为 2 ,刚开始看到不知道为啥是2.。。
那接下来看看这个就知道为甚么是 2 了
我把输入数据加到三个,然后返回值是 3 偏执的我把输入数据变为4个,结论很正确返回值为4
那么违法输入呢
这里现象也很明显,当第一个数据合法的时候,后面有几个合法的返回值为几
当第一个数据不合法的话,返回值始终为 0
至此,我做个总结,scanf在接受输入时,若第一个数据合法,那么输入数据中有几个合法的,返回值为几,当数据都不合法或者第一个数据就不合法,那么返回值始终为0;
下面我要看空格对scanf的影响
可以看到,基本没有影响。
所以开始说的那个题目中
while(scanf(“%d”,&i)!=0)是不正确的,应该改为 while(scanf(“%d”,&i)==1),当接受一个数据时执行一次。
下面是引用百度文库的说法(http://baike.baidu.com/link?url=L0n17aMiJ2o3OxldfwQPhB6JTvieWZh8KqWdiVUYcmlKYG0lKfbnFH1usjt6QuZ7n2lZ51ZHRBRFIls45_chFq#1)
函数原型编辑
1
|
intscanf(constchar*format,...);
|
2返回值编辑
1
|
scanf
(
"%d %d"
,&a,&b);
|
空白符