zoukankan      html  css  js  c++  java
  • C中用scanf()时应注意的一些问题

      最近在做题时遇到了scanf()的一些问题,下面说一下,scanf()中一些需要注意的地方:

    先说一下scanf()的格式:

    scanf(“格式控制字符串”, 地址表列);

    0、格式字符串一般形式如下:

    %[*][输入数据宽度][长度]类型

    其中有方括号[]的项为任选项,举个*的栗子:

    #include <stdio.h>
    int main()
    {
        int a,c;
        scanf("%3d%*d%d",&a,&c);//第二个%d被略过了
        printf("%d
    %d",a,c);
        return 0;
    }

    1、scanf函数中没有精度控制,而printf()可以,如下:

    #include <stdio.h>
    int main()
    {
        float a;
      //  scanf("%3.2f",&a); 错误写法
        scanf("%f",&a);
        printf("%3.2f",a);
        return 0;
    }

    2、在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束,如下:

    #include <stdio.h>
    int main()
    {
        int a;
        scanf("%d",&a);
        printf("%d",a);
        return 0;
    }

    其中数据结束在d,所以输出123

    3、在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符,如下:

    #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;
    }

    其中a为d,b为空格,c为e

    4、若想在输入字符时用空格隔开则这样写:

    #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;
    }

    注:如果输入的是整形等非字符型数据,根据2、可知道不须这么写,因为空格会被视为非格式串。

    5、scanf()中%s和%c的区别:

    首先声明:在键盘中敲入字符后,字符会首先保存在键盘缓冲区中供scanf函数读取(scanf,getchar等函数是读取缓冲区,getch函数是读取的控制台信息,即为直接从键盘读取)。另外特别注意键盘上敲入回车实际为“ ”,但存储到缓冲区时候会舍弃‘ ’而只存储 .例如我们敲入字符“12345回车”,缓冲区内存储的为“12345 ”

    对于scanf以%s格式输入时候,“空格、换行符、TAB”等是作为两个数据的分隔符存在的,即分隔符前后是两个数据,读入时候分隔符不读入。

    对于scanf以%c格式输入时候,“空格、换行符、TAB”等是正常字符。

    举个栗子:

    #include <stdio.h>
    int main()
    {
        char c;
        char a[10];
        scanf("%s",a);
        scanf("%c",&c);
        printf("%s",a);
        printf("%c****",c);
        return 0;
    }

    “adc”存进了字符数组a,%s视空格为分隔符,但是空格存进了缓冲区,%c视空格为正常字符读进了c。

    再来个栗子:

    若让你输入如下所示n行n列的字符如:

    abc

    def

    ghi

    则应用%s,而不是%c,代码如下

    #include <stdio.h>
    int main()
    {
        int i,j;
        char a[3][3];
        for(i=0;i<3;i++){
            scanf("%s",a[i]);
        }
        for(i=0;i<3;i++){
            for(j=0;j<3;j++){
                    printf("%c",a[i][j]);
            }
        }
        return 0;
    }

    本文参考自http://c.biancheng.net/cpp/html/34.html

    祝你早日攒够失望,然后开始新的生活。
  • 相关阅读:
    存储类&作用域&生命周期&链接属性
    关于mysql数据库的备份和还原
    Centos 7下mysql的安装与配置
    基于Apache+php+mysql的许愿墙网站的搭建
    关于php留言本网站的搭建
    linux下面桌面的安装
    时间同步ntp服务的安装与配置
    通过挂载系统光盘搭建本地yum仓库的方法
    linux系统root用户忘记密码的重置方法
    linux系统的初化始配置
  • 原文地址:https://www.cnblogs.com/LuRenJiang/p/6906333.html
Copyright © 2011-2022 走看看