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的拓展用法——匹配特定字符的更多相关文章

  1. 一个通用的php正则表达式匹配或检测或提取特定字符类

      在php开发时,日常不可或缺地会用到正则表达式,可每次都要重新写,有时忘记了某一函数还要翻查手册,所以,抽空写了一个关于日常所用到的正则表达式区配类,便于随便移置调用.(^_^有点偷懒). /*/ ...

  2. 羽夏闲谈—— C 的 scanf 的高级用法

    前言   今天看到博友发了个有关scanf的使用的注意事项,就是讨论缓冲区残存数据的问题,用简单的代码示例复述一下: #define _CRT_SECURE_NO_WARNINGS #include ...

  3. 题目1049:字符串去特定字符——九度OJ

    题目1049:字符串去特定字符 http://ac.jobdu.com/problem.php?pid=1049 时间限制:1 秒 内存限制:32 兆 题目描述: 输入字符串s和字符c,要求去掉s中所 ...

  4. C语言中关于scanf函数的用法

    scanf()函数的控制串 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化 ...

  5. 正则表达式——WPF输入控件TextBox 限定输入特定字符

    概念: 正则表达式是对字符串操作的一种逻辑公式, 就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”, 这个“规则字符串”用来表达对字符串的一种过滤逻辑. 目的: 给定一个正 ...

  6. 如何替换某文件中的所有的特定字符?---linux sed命令(文本编辑命令) (转载)

    转自:http://blog.csdn.net/year_9/article/details/20318407 sed是一个很好的文件处理工具,主要是以行为单位进行处理,可以将数据行进行替换.删除.新 ...

  7. 匹配中文字符的正则表达式: [/u4e00-/u9fa5]

    原文:匹配中文字符的正则表达式: [/u4e00-/u9fa5] 这里是几个主要非英文语系字符范围(google上找到的): 2E80-33FFh:中日韩符号区.收容康熙字典部首.中日韩辅助部首.注音 ...

  8. js正则表达式验证、匹配数字、匹配字符串、匹配中文、匹配任意字符备忘录

    本文转自:91博客 :原文地址:http://www.9191boke.com/235792704.html 正则表达式或“regex”用于匹配字符串的各个部分,下面是我创建正则表达式的备忘录.包括一 ...

  9. Python字符串中添加、插入特定字符

    分析 我们将添加.插入.删除定义为: 添加: 在字符串的后面或者前面添加字符或者字符串 插入: 在字符串之间插入特定字符 在Python中,字符串是不可变的.所以无法直接删除.插入字符串之间的特定字符 ...

随机推荐

  1. js中实现 复制到剪切板 功能

    一:引包 <script type="text/javascript" src="jquery.js"></script> <sc ...

  2. Java 读取HDFS文件系统

    最近有个需求,计算用户画像. 系统大概有800W的用户量,算每个用户的一些数据. 数据量比较大,算用hive还是毫无压力的,但是写的oracle,在给出数据给前端,就比较难受了. 然后换了种解决方法: ...

  3. linux 下安装安装mysql 5.6. 5.7

    linux版本:CentOS7 64位 5.7.20 安装请看 他人博客 我已经安装成功了 https://www.cnblogs.com/cz-xjw/p/8006904.html 5.6安装 前提 ...

  4. P1(2)线性回归

    线性回归问题,是监督学习,输出是连续值.(批梯度下降训练参数+平方误差函数做代价函数)

  5. 微信小程序之下拉加载和上拉刷新

    微信小程序下拉加载和上拉刷新两种实现方法 方法一:onPullDownRefresh和onReachBottom方法实现小程序下拉加载和上拉刷新 首先要在json文件里设置window属性       ...

  6. js基础学习笔记(三)

    3.1 认识DOM 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节点树). 先来看看 ...

  7. AIX 补丁升级

    下载地址:http://www-933.ibm.com/support/fixcentral 1.root登陆系统: 2.对系统进行备份或者克隆(见上一篇抄袭IBM官方文档的文章): 3.官方建议为/ ...

  8. 判断页面是app打开还是浏览器打开。cookie

    有个需求需要对页面判断不同的打开方式来最里面的链接进行不同调整, 这样就要分四种情况,app,浏览器X安卓系统,苹果系统,起初是对页面url地址带有的参数(安卓)跟用户代理(苹果)返回值判断navig ...

  9. C++中的public、protected 及 private 用法

    首先需要明白几点: 1,类的一个特性就是封装,public 和 private 作用就是实现这一目的的. 用户代码(类外)可以访问public成员而不能访问private成员:private成员只能由 ...

  10. (DFS)展开字符串 -- hdu -- 1274

    http://acm.hdu.edu.cn/showproblem.php?pid=1274 展开字符串 Time Limit: 2000/1000 MS (Java/Others)    Memor ...