zoukankan      html  css  js  c++  java
  • scanf的用法1

    必须先声明一下,是转自他人网页

    我曾经在这个函数上犯过不少错误,也看到别人犯过的错误,记下来,提醒自己不要重蹈覆辙了。如果对你有用,那就更好了:)如果你发现文章中有错误,欢迎你不吝赐教。希望和大家一起学习
    有关详细的scanf函数解释,大家可以去看看《C程序设计语言》(K&C)和《C语言大全》(后面我把其中scanf的部分贴了出来)。


    曾经错的几个地方:(xpsp2vc6.0环境下)
    1.
    空白符问题
    #include<stdio.h>
    main()
    {   
    int a;
    printf("input the data\n");
    scanf("%d\n",&a);//
    这里多了一个回车符\n
        printf("%d",a);
    return 0;
    }
    结果要输入两个数程序才结束,而不是预期的一个。why
    原因:用空白符结尾时,scanf会跳过空白符去读下一个字符,所以你必须再输入一个数。这里的空白符包括空格,制表符,换行符,回车符和换页符。所以如果你用scanf("%d   ",&a)也会出现同样的问题。
    解决方法:这种错误大多是输入的时候不小心,多注意一点就好了。这种问题也不好检查,编译没有问题,一个空格也不容易看出来。当你的程序出现上面的问题时,自己对照检查一下就可以了。


    2.
    缓冲区问题
    这是一个非常容易错的地方,我就错过多次。
    #include <stdio.h>
    main()
    {
    int n = 5;
    char c[n];
    for(int i = 0; i < n; i++)
       c[i] = scanf("%c",&c[i]); 
    printf(c);
    return 0;
    }
    如果输入:
    a
    b
    c
    那么循环就会提前结束了.
    原因:输入a和第一个回车后,a和这个回车符都留在缓冲区中。第一个scanf读取了a,但是输入缓冲区里面还留有一个\n,第二个scanf读取这个\n。然后输入b和第二个回车,同样的,第三个scanf读取了b,第四个scanf读取了第二个回车符。第五个读取了c。所以五个scanf都执行了,并没有提前结束。只不过有的scanf读取到了回车符而已。
    解决方法:把程序改成这样就可以了:
    for( i = 0; i < n; i++){
       scanf("%c",&c[i]);
    fflush(stdin);//
    刷新缓冲区
    }
    或者不用scanf,而用gets()函数,如:
    #include<stdio.h>
    main()
    {   
    char c[5];
    gets(c);
    printf(c);
    return 0;
    }
    但要注意:这个函数自动把你最后敲的回车转换为字符'\0'。如果你的输入超过了数组的大小,那么就会产生错误。


    3.scanf()
    函数的参数输入类型不匹配问题
    这是我在csdn论坛上见到的问题,这个错误有时候会让人莫名其妙。
    #include<stdio.h>
    main()
    {
    int a=123;
    char c='t';
    printf("input\n");
    scanf("%d%c",&a,&c);
    scanf("%d%c",&a,&c);
    scanf("%d%c",&a,&c);
    printf("%d\n%c\n",a,c);
    return 0;
    }
    当输入回车 后,会直接跳过下面2个scanf语句,直接输出为
    123
    t
    原因:对于scanf("%d%c",&a,&c)scanf语句执行时,首先试图从缓冲区中读入一个%d类型的数据,如果和第一个参数匹配,则继续从缓冲区中读取数据和第二个参数进行匹配,依次进行下去,直到匹配完所有的参数;如果其中有一个参数不匹配,那就从这个地方跳出,忽略这个scanf后面所有的参数,而去执行下一条语句。 
    可以用下面的程序验证一下:
    #include <stdio.h>
    int main()
    {
    int a=123,b=1;
    char c='t';
        scanf("%d%d",&a,&b);
    scanf("%c",&c);
    printf("%d\n%d\n%c\n",a,b,c);
    return 0;
    }
    输入:回车回车
    结果是:
    2
    1
    a
    解决方法scanf()函数执行成功时的返回值是成功读取的变量数,也就是说,你这个scanf()函数有几个变量,如果scanf()函数全部正常读取,它就返回几。但这里还要注意另一个问题,如果输入了非法数据,键盘缓冲区就可能还个有残余信息问题。
    比如:
    #include <stdio.h>
    main()
    {
    int a=123,b;
    while(scanf("%d%d",&a,&b)!=2)
       fflush(stdin);
    printf("%d\n%d\n",a,b);
    return 0;
    }
    你可以试一下,如果输入不是数字时,会有什么反应。

    补充scanf中一种很少见但很有用的转换字符:[...][ ^...]
    #include<stdio.h>
    main() 

    char strings[100]; 
    scanf("%[1234567890]",strings); 
    printf("%s",strings);
    return   0; 

    运行,输入:1234werew后,结果是:1234
    通过运行可以发现它的作用是:如果输入的字符属于方括号内字符串中某个字符,那么就提取该字符;如果一经发现不属于就结束提取。该方法会自动加上一个字符串结束符到已经提取的字符后面。 
    scanf("%[^1234567890]",strings); 
    它的作用是:如果一经发现输入的字符属于方括号内字符串中某个字符,那么就结束提取;如果不属于就提取该字符。该方法会自动加上一个字符串结束符到已经提取的字符后面。 
    注意:方括号两边不能空格,如:scanf("%[ 1234567890 ]",strings); scanf("%[ ^1234567890 ]",strings); 不让空格也会算在里面的。
    用这种方法还可以解决scanf的输入中不能有空格的问题。只要用
    scanf("%[^\n]",strings); 
    就可以了。很神奇吧。

    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=570487

  • 相关阅读:
    Advanced Configuration Tricks
    Reviewing the Blog Module
    Editing and Deleting Data
    Making Use of Forms and Fieldsets
    Understanding the Router
    SQL Abstraction and Object Hydration
    Preparing for Different Databases
    Java学习理解路线图
    Openstack学习历程_1_视频
    CentOS安装Nginx负载
  • 原文地址:https://www.cnblogs.com/WangCT/p/2292861.html
Copyright © 2011-2022 走看看