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. Django 自定义模板标签TemplateTags

    创建自定义的模板标签(template tags) Django提供了以下帮助函数(functions)来允许你以一种简单的方式创建自己的模板标签(template tags): simple_tag ...

  2. /bin/sh^M:bad interpreter:

    /bin/sh^M:bad interpreter: No such file or directory 这个错误发生在你在windows下编写文件上传到linux服务器去运行的时候. 错误原因:wi ...

  3. oracle 查看表空间使用情况

    查看表空间剩余: ||'M' from dba_free_space group by tablespace_name 查看表空间总大小.使用大小.剩余大小,使用率.剩余率 ) useded, tru ...

  4. 2018.11.01 洛谷P3953 逛公园(最短路+dp)

    传送门 设f[i][j]f[i][j]f[i][j]表示跟最短路差值为iii当前在点jjj的方案数. in[i][j]in[i][j]in[i][j]表示在被选择的集合当中. 大力记忆化搜索就行了. ...

  5. 通过html文件生成PDF文件

    /// <summary> /// 获取html内容,转成PDF(注册) /// </summary> public void DownloadPDFByHTML(string ...

  6. Codeforces Round #524 (Div. 2) F. Katya and Segments Sets(主席树)

    https://codeforces.com/contest/1080/problem/F 题意 有k个区间,区间的种类有n种,有m个询问(n,m<=1e5,k<=3e5),每次询问a,b ...

  7. Win7 VS2015环境编译cegui-0.8.5

    首先是去官网下载源码与依赖库 http://cegui.org.uk/ 然后得提一下,编译DX11版本带Effects11框架的话会有问题,也就是默认情况编译有问题,这是因为VS2015升级后编译器对 ...

  8. 使用bat批处理文件定时自动备份oracle数据库并上传ftp服务器

    一.使用bat批处理文件备份oracle(前提是配置好oracle数据库客户端) @echo off set databasename=orcl  //数据库名 set username=ninic ...

  9. java常用设计模式三:原型模式

    在说原型模式之前先说一下浅拷贝和深拷贝的概念 一.浅拷贝和深拷贝 1.浅拷贝 在java中,对象创建后需要有一个引用变量来指向该对象实际的地址空间,也就是说引用变量与对象实体是两个不同的数据体.在Ob ...

  10. c++中typedef、define、const、inline之间的区别

    1.typedef和#define的区别 typedef int* pInt; , b = ; const pInt p1 = &a; //p1是常量指针 pInt const p2 = &a ...