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. Windows-universal-samples学习笔记系列四:Data

    Data Blobs Compression Content indexer Form validation (HTML) IndexedDB Logging Serializing and dese ...

  2. input.file样式修改

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. c#的装箱和拆箱及值类型和引用类型

    装箱:它允许根据值类型创建一个对象,然后使用对这新对象的一个引用. int i = 5; object o = i; int j = (int)o; 装箱:运行时将在堆上创建一个包含值5的对象(它是一 ...

  4. Java HttpURLConnection 下载图片 图片全是“加密图片”文字,怎么解决?

    package com.qzf.util; import java.io.FileOutputStream;import java.io.IOException;import java.io.Inpu ...

  5. ios 数组和字典

    一.数组.  数组只能存放对象类型的数据  2.数组中的对象是有序的 (index)     (一)可变数组   NSArray:NSObject  不可变数组 作用:容器类 存放的是对象类型的数据, ...

  6. 使用函数的列 group by 分组需要别名

    问题描述 使用如下截图的SQL统计数据,报1105错误,提示all columns in group by clause should be in the selected column. 给格式化 ...

  7. 用JAVA实现大文件上传及显示进度信息

    一. 大文件上传基础描述: 各种WEB框架中,对于浏览器上传文件的请求,都有自己的处理对象负责对Http MultiPart协议内容进行解析,并供开发人员调用请求的表单内容. 比如: Spring 框 ...

  8. Remote Debugging (1)

    The client/server design of the Java debugger allows you to launch a Java program from computer on y ...

  9. Hadoop-2.8.0分布式安装手册

    目录 目录 1 1. 前言 3 2. 特性介绍 3 3. 部署 5 3.1. 机器列表 5 3.2. 主机名 5 3.2.1. 临时修改主机名 6 3.2.2. 永久修改主机名 6 3.3. 免密码登 ...

  10. html部分常用标签的含义及作用

    1.a 超链接 <a> 标签定义超链接,用于从一张页面链接到另一张页面.<a> 标签中必须提供 href 属性或 name 属性,它指示链接的目标. 例如:点击 百度一下 跳转 ...