• scanf的拓展用法——匹配特定字符


    scanf的基本用法除了常规的输入操作外还有一些特殊的用法,使用这些用法可以很方便的在输入中读取想要的数据

    1、限制输入数据的长度

    这个应该算不上拓展用法,大多数读者应该都曾经使用过,这里简单提一下

    输入int类型

    int main()
    {
        int a = 10;
    
        scanf("%3d", &a);
        printf("%d", a);
    
        return 0;
    }

    scanf("%3d", &a)限制输入数据的长度最多为3,如果数据长度大于3则只读取前3位数据,如果输入数据长度小于3,因为有回车符的存在也会结束输入

    运行结果:

    输入char类型

    注意输入char字符类型时不能限定长度(注意是字符,不是字符串),笔者目前能查到的信息给出的原因:语法规定,其实想一下也说得通,读取一个字符,总不能scanf("%2c")把两个字符塞到一个字符的空间里吧

    输入字符串类型

    int main()
    {
        char ss[20];
    
        scanf("%5s", ss);
        puts(ss);
    
        return 0;
    }

    scanf("%5s", ss)表示读取的字符串的最大长度为5,或者说,最多读取5个字符

    运行结果:

    如果长度不足5,也会结束输入,因为有换行符的存在

    2、scanf匹配特定字符

    scanf匹配特定字符的格式为:%[xxx],[ ]包围起来的是需要读取的字符集合

    例如:

    char ss[10];
    scanf("%[abcd]", ss);

    %[abcd]表示只读取字符abcd遇到其它的字符就读取结束(这句话是重点),如果abcd字符在字符串的中间部分那么就不能正常读取字符

    测试不同输入的结果:

    测试用例一:

    (注意abcd的顺序没有要求,输入bcda,badc等是可以正常读入的)

     

    测试用例二:

    (只读取了ab字符,遇到z时就结束输入)

    测试用例三:

    (第一个字符是z结束输入,字符串未初始化输出为垃圾值) 

    匹配特定字符还有一种更简单的写法,比如要匹配所有小写字母,可以写成%[a-z],匹配所有大字字符,可以写成%[A-Z](需要注意的是左边的字符要小于右边的字符),利用这种写法可以很方便的完成一些特定输入的读取

    读取所有的大小写字母

    char ss[20];
    
    scanf("%[a-zA-Z]", ss);
    puts(ss);

    上这种写法有一个缺点,就是如果大小写字母中间有其他字符的话就会直接结束输入,运行示例如下

    测试用例一:(中间没有其他字符)

    测试用例二:(中间有其他字符)

    (这种情况就是之前说的了,中间出现了其他字符,就会结束输入)

    为了解决上面这种情况,对上面的代码做一些修改,以解决空白符的情况,修改后代码如下

    char ss[20];
    
    scanf("%[a-z A-Z]", ss);
    puts(ss);

    其实就是在中间加一个空格,意思是空格也算匹配字符如果输入中有空格符也会被正常读取,运行效果如下

    (需要注意的是,这条语句scanf("%[a-z A-Z]", ss)空格的位置不一定要放在中间,可以放在最前面scanf("%[ a-zA-Z]", ss),也可以放在最后面,scanf("%[a-zA-Z ]", ss))

    如果输入的字母中间除了空格还有制表符(两者都算空白符),需要再加一个

    scanf("%[a-z 	A-Z ]", ss);

    运行效果:

    如果想读取数字可以写成:

    scanf("%[0-9]", ss);

     

    3、不匹配某些字符(也可以叫过滤某些字符)

    不匹配某些字符只需要在[ ]内的最前面加一个^就可以了,例如:

    char ss[20];
    scanf("%[^0-9]", ss);
    
    puts(ss);
    scanf("%[^0-9]", ss)表示匹配除0-9之外的所有字符,遇到到0-9的数字就结束输入,运行结果如下:

    读者到这里可以发现,scanf函数
    可以用不匹配某些字符的写法来完全替代gets函数了,代码如下
    char ss[20];
    
    scanf("%[^
    ]", ss);
    puts(ss);

    scanf("%[^ ]", ss)的意思就是读取除换行符之外的所有字符(是不是和gets的功能一模一样了)

    4、丢弃读取到的字符

    scanf() 允许把读取到的数据直接丢弃,不往变量中存放,具体方法就是在 % 后面加一个*,例如:

    scanf("%*[a-z]");
    scanf("%*[a-z]")表示将读取到的小写字母丢弃


    scanf("%*[0-9]");
    scanf("%*[0-9]")表示将读取到的数字丢弃

     

    代码示例:

    char ss[20];
    
    scanf("%*[a-z]");
    scanf("%s", ss);
    puts(ss);

    运行效果:

    这种写法有一个问题就是,在可读入字符后面如果还有符合丢弃条件的字符也会读取,而不会被丢弃,运行效果如下

    (意思是这种丢弃只发生在不满足丢弃条件的第一个字符之前(这句话有点绕),以上面的这个例子来说,在大写字母ABCD之前的小写字母abcd的确被丢弃了,但是大写字母ABCD后面还有小写字母abcd,此时丢弃就不再起作用了)

  • 相关阅读:
    2019年上半年收集到的人工智能深度学习方向干货文章
    2019年上半年收集到的人工智能自然语言处理方向干货文章
    2019年上半年收集到的人工智能图神经网络干货文章
    2019年上半年收集到的人工智能自动驾驶方向干货文章
    SAP 不支持交货单中同一个物料多个行项目HU与序列号组合发货场景
    SAP S4HANA 使用BP创建供应商报错
    yum/dnf/rpm 等 查看rpm 包安装路径 (fedora 中 pygtk 包内容安装到哪里了)
    apache 允许 访问软链接 ( Apache won't follow symlinks (403 Forbidden) )
    fedora 开启 apache 并 开启目录浏览模式
    如何在 windows server 2008 上面 挂载NFS
  • 原文地址:https://www.cnblogs.com/lanhaicode/p/10585418.html
Copyright © 2020-2023  润新知