zoukankan      html  css  js  c++  java
  • scanf()函数

    Scanf函数攻略:

    A                格式化说明符
    格式字符           说明


    %d                
    读入十进制整数

    %u                 读入一个无符号十进制整数

    %lld                    长整型

    %I64d                64位整形

     

    %f                 读入一个浮点数float

    %lf                      读入一个浮点数double


    %o                
    读入八进制整数
    %x                
    读入十六进制整数
    %X                
    同上


    %c                
    读入一个字符
    %s                
    读入一个字符串

    %[]               
    扫描字符集合
    %%                
    %符号
                    
    附加格式说明字符表

    修饰符                       说明

    L/l 长度修饰符               输入""数据
    h
    长度修饰符                 输入""数据
    W
    整型常数                   指定输入数据所占宽度
    *
    星号                       空读一个数据 
    B         空白字符

    空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符,空白符可以是space,tab,newline等等,直到第一个非空白符出现为止。

    #include<stdio.h>

    int main(){

             char a,b,c;

             scanf("%c %c %c",&a,&b,&c);

             printf("%c,%c,%c ",a,b,c);

             return 0;

    }

    #include<stdio.h>

    int main(){

             int a;

             scanf("%d ",&a); );//这里多了一个换行符’ ’

        printf("%d ",a);

        return 0;

    }

    结果要输入两个数程序才结束,而不是预期的一个。why 

    原因:用空白符结尾时,scanf会跳过空白符去读下一个字符,所以你必须再输入一个数。这里的空白符包括: 空格,制表符,换行符,回车符和换页符。所以如果你用scanf( "%d ",&a)也会出现同样的问题。 
    解决方法:自己平时注意。当出现这样的问题的时候,可以检查一下代码。 

    C        非空白字符

    一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。

    #include<stdio.h>

    int main(){

             int a,b,c;

             scanf("%d,%d,%d",&a,&b,&c);

             printf("%d,%d,%d ",a,b,c);

             return 0;

    }

    运行时按如下方式输入三个值:

    3,4,5 (输入a,b,c的值)

    或者

    3,□4,□5 (输入a,b,c的值)

    3,□□□4,□5 (输入a,b,c的值)
    ......


    都是合法的,但是","一定要跟在数字后面,如:
    3□,4,5
     就非法了,程序出错。(解决方法与原因后面讲)

     

    问题探讨:

     

    问题scanf()函数不能正确接受有空格的字符串?如: i love you

    #include<stdio.h>

    int main(){

        char s[50];

        scanf("%s",s);

        printf("%s ",s);

        return 0;

    }

    解决:

    #include<stdio.h>

    int main(){

             char s[50];

             /*scanf("%s",s);不能接收空格符*/

             scanf("%[^ ]",s);

             printf("%s ",s);

             return 0;

    }

     

    问题2 单个字符char 吸收空格、回车

    #include<stdio.h>

    int main(){

             int a;

             char c;

             scanf("%d",&a);

        scanf("%c",&c);

        printf("%d %c ",a,c);

        return 0;

    }

    原因:c吸收了回车

    解决1:处理掉回车

    #include<stdio.h>

    int main(){

             int a;

             char c;

             scanf("%d",&a);

             getchar();//吸收回车 //或者 fflush(stdin);//清除一个流

        scanf("%c",&c);

        printf("%d %c ",a,c);

        return 0;

    }

    解决2:使用“空白字符”屏蔽回车

    #include<stdio.h>

    int main(){

             int a;

             char c;

             scanf("%d",&a);

        scanf(" %c",&c);//注意%c前有个空格

        printf("%d %c ",a,c);

        return 0;

    }

     

    问题如何处理scanf()函数误输入造成程序死锁或出错?

    #include<stdio.h>

    int main(){

             int a,b,c; /*计算a+b*/

             scanf("%d%d",&a,&b);

             c=a+b;

             printf("%d+%d=%d ",a,b,c);

             return 0;

    }

    如果输入了错误的类型,你的程序不是死锁,就是得到一个错误的结果。

    解决方法:利用scanf()函数执行成功时的返回值是成功读取的变量数。但这里还要注意另一个问题,如果输入了非法数据,键盘缓冲区就可能还个有残余信息问题。

    #include<stdio.h>

    int main(){

             int a,b,c; /*计算a+b*/

             while(scanf("%d%d",&a,&b)!=2)fflush(stdin);

             c=a+b;

             printf("%d+%d=%d ",a,b,c);

             return 0;

    }

     

    问题4 scanf()函数的参数输入类型不匹配问题 

    #include<stdio.h>

    int main(){

             int a=123;

             char c='t';

             scanf("%d%c",&a,&c);

             scanf("%d%c",&a,&c);

             scanf("%d%c",&a,&c);

             printf("%d %c ",a,c);

             return 0;

    }

    当输入a 回车后,会直接跳过下面2个scanf语句,直接输出为 
    123 

    原因:对于scanf( "%d%c ",&a,&c)scanf语句执行时,首先试图从缓冲区中读入一个%d类型的数据,如果和 第一个参数匹配,则继续从缓冲区中读取数据和第二个参数进行匹配,依次进行下去,直到匹配完所有的参 数;如果其中有一个参数不匹配,那就从这个地方跳出,忽略这个scanf后面所有的参数,而去执行下一条语 句。 

    可以用下面的程序验证一下: 

    #include<stdio.h>

    int main(){

             int a=0,b=0;

             char c='a';

             scanf("%d%d",&a,&b);

             scanf(" %c",&c); //%c前加空格,屏蔽回车

             printf("%d %d %c ",a,b,c);

             return 0;

    }

    输入: 3 a

    输出:

    3

    0

    a

    解决:同  问题

    #include<stdio.h>

    int main(){

             int a=0,b=0;

             char c='a';

             while(scanf("%d%d",&a,&b)!=2)fflush(stdin);

             scanf(" %c",&c);//%c前加空格,屏蔽回车

             printf("%d %d %c ",a,b,c);

             return 0;

    }

    只有输入正确数据,例如:

    100 100

    a

    时,才出结果。

     

    补充:扫描集[...]和补集[ ^...] 

    1扫描集[...]

    #include<stdio.h>

    int main(){

             char s[100];

             scanf("%[1234567890]",s);

             printf("%s ",s);

             return 0;

    }

    通过运行可以发现它的作用是:如果输入的字符属于方括号内字符串中某个字符,那么就提取该字符;如果 一经发现不属于就结束提取。该方法会自动加上一个字符串结束符到已经提取的字符后面。

    注意:a方括号两边如果有空格,如:scanf( "%[ 1234567890 ] ",strings); 那么空格也会算在里面的,即可以提取空格。

    b对于许多实现来说,用连字符可以说明一个范围。例如,以下扫描集使 scanf() 接受字母 A Z%[A-Z] 

     

    2补集[ ^...] 

    用字符 ^ 可以说明补集。把 ^ 字符放为扫描集的第一字符时,构成其它字符组成的命令的补集合,指示 scanf() 只接受未说明的其它字符。 

     scanf("%[^1234567890]",s); 它的作用是:如果一经发现输入的字符属于方括号内字符串中某个字符 ,那么就结束提取;如果不属于就提取该字符。该方法会自动加上一个字符串结束符到已经提取的字符后面  

    用这种方法还可以解决一般的scanf的输入中不能有空格的问题。

    只要用 scanf("%[^ ]",s); 就可以了。

  • 相关阅读:
    linux php安装ODBC扩展
    linux wget变成000权限
    linux tomcat启动报错:Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
    字符串的操作, 日期格式, 数据转换, 模糊查询
    Oracle控制结构
    创建角色,用户,视图,索引,分析计划
    Oracle用触发器解决修改主表A主键值,从表的外键值也会跟着改变的问题
    行为科学统计第17章--回归
    行为科学统计第13-15章
    行为科学统计第12章
  • 原文地址:https://www.cnblogs.com/gongpixin/p/4477354.html
Copyright © 2011-2022 走看看