C语言scanf的探索

</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,...);
函数 scanf() 是从 标准输入流stdio (标准输入设备,一般是键盘)中读内容的通用 子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中。
其调用形式为: scanf("<格式说明字符串>",<变量地址>);变量地址要求有效,并且与格式说明的次序一致。

2返回值编辑

scanf()函数返回成功赋值的数据项数,读到文件末尾出错时则返回EOF。
如:
1
scanf ( "%d %d" ,&a,&b);
如果a和b都被成功读入,那么scanf的返回值就是2
如果只有a被成功读入,返回值为1
如果a和b都未被成功读入,返回值为0
如果遇到错误或遇到end of file,返回值为 EOF
且返回值为 int型.

空白符

空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符。


这只是我自己我一次探索,弄完之后感觉再看标准的答案后,会找到很多新的知识,也许知识就应该像这样来探索式学习吧,直接看标准答案那就没意思了,不如说背答案。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值