scanf的拓展用法——匹配特定字符
scanf的基本用法除了常规的输入操作外还有一些特殊的用法,使用这些用法可以很方便的在输入中读取想要的数据
1、限制输入数据的长度
这个应该算不上拓展用法,大多数读者应该都曾经使用过,这里简单提一下
输入int类型
int main()
{
int a = ; scanf("%3d", &a);
printf("%d", a); return ;
}
scanf("%3d", &a)限制输入数据的长度最多为3,如果数据长度大于3则只读取前3位数据,如果输入数据长度小于3,因为有回车符的存在也会结束输入
运行结果:

输入char类型
注意输入char字符类型时不能限定长度(注意是字符,不是字符串),笔者目前能查到的信息给出的原因:语法规定,其实想一下也说得通,读取一个字符,总不能scanf("%2c")把两个字符塞到一个字符的空间里吧
输入字符串类型
int main()
{
char ss[]; scanf("%5s", ss);
puts(ss); return ;
}
scanf("%5s", ss)表示读取的字符串的最大长度为5,或者说,最多读取5个字符
运行结果:

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

2、scanf匹配特定字符
scanf匹配特定字符的格式为:%[xxx],[ ]包围起来的是需要读取的字符集合
例如:
char ss[];
scanf("%[abcd]", ss);
%[abcd]表示只读取字符abcd,遇到其它的字符就读取结束(这句话是重点),如果abcd字符在字符串的中间部分那么就不能正常读取字符
测试不同输入的结果:
测试用例一:
\
(注意abcd的顺序没有要求,输入bcda,badc等是可以正常读入的)
测试用例二:

(只读取了ab字符,遇到z时就结束输入)
测试用例三:

(第一个字符是z结束输入,字符串未初始化输出为垃圾值)
匹配特定字符还有一种更简单的写法,比如要匹配所有小写字母,可以写成%[a-z],匹配所有大字字符,可以写成%[A-Z](需要注意的是左边的字符要小于右边的字符),利用这种写法可以很方便的完成一些特定输入的读取
读取所有的大小写字母
char ss[];
scanf("%[a-zA-Z]", ss);
puts(ss);
上这种写法有一个缺点,就是如果大小写字母中间有其他字符的话就会直接结束输入,运行示例如下
测试用例一:(中间没有其他字符)

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

(这种情况就是之前说的了,中间出现了其他字符,就会结束输入)
为了解决上面这种情况,对上面的代码做一些修改,以解决空白符的情况,修改后代码如下
char ss[];
scanf("%[a-z A-Z]", ss);
puts(ss);
其实就是在中间加一个空格,意思是空格也算匹配字符如果输入中有空格符也会被正常读取,运行效果如下

(需要注意的是,这条语句scanf("%[a-z A-Z]", ss)空格的位置不一定要放在中间,可以放在最前面scanf("%[ a-zA-Z]", ss),也可以放在最后面,scanf("%[a-zA-Z ]", ss))
如果输入的字母中间除了空格还有制表符(两者都算空白符),需要再加一个\t
scanf("%[a-z \tA-Z ]", ss);
运行效果:

如果想读取数字可以写成:
scanf("%[0-9]", ss);
3、不匹配某些字符(也可以叫过滤某些字符)
不匹配某些字符只需要在[ ]内的最前面加一个^就可以了,例如:
char ss[];
scanf("%[^0-9]", ss); puts(ss);
scanf("%[^0-9]", ss)表示匹配除0-9之外的所有字符,遇到到0-9的数字就结束输入,运行结果如下:

读者到这里可以发现,scanf函数可以用不匹配某些字符的写法来完全替代gets函数了,代码如下
char ss[];
scanf("%[^\n]", ss);
puts(ss);
scanf("%[^\n]", ss)的意思就是读取除换行符之外的所有字符(是不是和gets的功能一模一样了)
4、丢弃读取到的字符
scanf() 允许把读取到的数据直接丢弃,不往变量中存放,具体方法就是在 % 后面加一个*,例如:
scanf("%*[a-z]");
scanf("%*[a-z]")表示将读取到的小写字母丢弃
scanf("%*[0-9]");
scanf("%*[0-9]")表示将读取到的数字丢弃
代码示例:
char ss[];
scanf("%*[a-z]");
scanf("%s", ss);
puts(ss);
运行效果:

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

(意思是这种丢弃只发生在不满足丢弃条件的第一个字符之前(这句话有点绕),以上面的这个例子来说,在大写字母ABCD之前的小写字母abcd的确被丢弃了,但是大写字母ABCD后面还有小写字母abcd,此时丢弃就不再起作用了)
scanf的拓展用法——匹配特定字符的更多相关文章
- 一个通用的php正则表达式匹配或检测或提取特定字符类
在php开发时,日常不可或缺地会用到正则表达式,可每次都要重新写,有时忘记了某一函数还要翻查手册,所以,抽空写了一个关于日常所用到的正则表达式区配类,便于随便移置调用.(^_^有点偷懒). /*/ ...
- 羽夏闲谈—— C 的 scanf 的高级用法
前言 今天看到博友发了个有关scanf的使用的注意事项,就是讨论缓冲区残存数据的问题,用简单的代码示例复述一下: #define _CRT_SECURE_NO_WARNINGS #include ...
- 题目1049:字符串去特定字符——九度OJ
题目1049:字符串去特定字符 http://ac.jobdu.com/problem.php?pid=1049 时间限制:1 秒 内存限制:32 兆 题目描述: 输入字符串s和字符c,要求去掉s中所 ...
- C语言中关于scanf函数的用法
scanf()函数的控制串 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化 ...
- 正则表达式——WPF输入控件TextBox 限定输入特定字符
概念: 正则表达式是对字符串操作的一种逻辑公式, 就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”, 这个“规则字符串”用来表达对字符串的一种过滤逻辑. 目的: 给定一个正 ...
- 如何替换某文件中的所有的特定字符?---linux sed命令(文本编辑命令) (转载)
转自:http://blog.csdn.net/year_9/article/details/20318407 sed是一个很好的文件处理工具,主要是以行为单位进行处理,可以将数据行进行替换.删除.新 ...
- 匹配中文字符的正则表达式: [/u4e00-/u9fa5]
原文:匹配中文字符的正则表达式: [/u4e00-/u9fa5] 这里是几个主要非英文语系字符范围(google上找到的): 2E80-33FFh:中日韩符号区.收容康熙字典部首.中日韩辅助部首.注音 ...
- js正则表达式验证、匹配数字、匹配字符串、匹配中文、匹配任意字符备忘录
本文转自:91博客 :原文地址:http://www.9191boke.com/235792704.html 正则表达式或“regex”用于匹配字符串的各个部分,下面是我创建正则表达式的备忘录.包括一 ...
- Python字符串中添加、插入特定字符
分析 我们将添加.插入.删除定义为: 添加: 在字符串的后面或者前面添加字符或者字符串 插入: 在字符串之间插入特定字符 在Python中,字符串是不可变的.所以无法直接删除.插入字符串之间的特定字符 ...
随机推荐
- SpringBoot注册Servlet/Filter/Listener
由于SpringBoot默认是以jar包的方式启动嵌入式的Servlet容器来启动SpringBoot的web应用,那么没有web.xml文件,如何配置我们的三大Web基础组件呢? 通过使用XXXRe ...
- Twitter 相关APP开发
首先要获取 Consumer Key (API Key), Consumer Secret (API Secret):最好申请Access Token 和Access Token Secret,不然验 ...
- 尼克的任务(P1280)
题目链接:尼克的任务 这道题,有点难度,也不是太难,因为我都做出来了. 好,下面分析一下: 这道题,显然的动规,我们这样设计状态. 我们设d[i]为从第i分钟初开始到结束有多少空闲时间. 那么我们的转 ...
- hdu 6073
题意: 给出一个二部图,U.V分别是二部图的两个点集,其中,U中每个点会有两条边连到V中两个不同的点. 完美匹配定义为:所有点都成功匹配. 思路:已知一定是完美匹配了呀(也一定存在),我们先把度数为一 ...
- 吓死baobao了
早上远程连接服务器连不上,后面重启服务器,显示进入紧急修复模式:welcome to emergency mode!after logging in ,type “journalctl -xb” to ...
- 第21章:MongoDB-聚合操作--聚合管道--$geoNear
①$geoNear 使用“$geoNear”可以得到附近的坐标点. ②范例:准备测试数据
- BZOJ 4407 于神之怒加强版 (莫比乌斯反演 + 分块)
4407: 于神之怒加强版 Time Limit: 80 Sec Memory Limit: 512 MBSubmit: 1067 Solved: 494[Submit][Status][Disc ...
- BZOJ 2120 数颜色 (带修莫队)
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 6367 Solved: 2537[Submit][Status][Discuss] ...
- shell 脚本学习
Shell简介 概述 Shell是一种具备特殊功能的程序,它提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令,并把它送入内核去执行.内核是Linux系统的心脏,从开机自检就驻留在计算机的内 ...
- php 验证码 图像存在错误 无法显示 解决方法
<?php $height = 300; $width = 300; $im = imagecreatetruecolor($width, $height); $white = imagecol ...