scanf函数之扫描集
前言
%[]是scanf函数不常用到的格式字符——扫描集(scanset),它的用法很简单,但却能巧妙地解决一些输入问题。(由于书籍里和网上对此格式字符的介绍很少且篇幅较小,本文可能会有些许错误,请读者勘误)
引入
介绍扫描集用法前,先明确下面三点:
1.扫描集用于赋值给字符型变量,包括字符串、字符数组。(不建议使用单个字符变量)
2.scanf函数以空白字符(空格符、制表符、回车符)结束对变量的赋值。
3.所有变量都已赋值的情况下,回车是对scanf函数的结束,即继续执行下面的命令。
以下给出示例来解释2、3点。
char str1[] , str2[]; puts("输入:");
scanf("%s%s",str1,str2); puts("输出:");
printf("str1 = %s\nstr2 = %s",str1,str2);
屏幕结果如下:
/* 使用空格符结束对变量的赋值 */
输入:
abc def
输出:
str1 = abc
str2 = def /* 使用回车符结束对变量的赋值 */
输入:
abc
def
输出:
str1 = abc
str2 = def
由上述示例可知,scanf函数的流程(只描述第二个输入)是:将输入的abc赋值给str1 -> 由于后面存在赋值的变量,输入的回车符作为结束对变量str1赋值的标志 -> 将输入的def赋值个str2 -> 由于后面无需要赋值的变量,回车符作为结束输入的标志
上述示例也引出了两个问题:
1.若想将空白字符赋值给变量怎么办?
2.能否使用其他字符作为结束对变量的赋值?
同时,也引出第三个问题:
3.怎么只读取特定字符呢?
用法
此时,扫描集就能解决上述三个问题,以下是它的两个格式,其中string为任意字符:
%[string] // 只读取包含在[]中的字符
%[^string] // 读取除[]中字符以外的字符,^为取反的意思
下面给出示例及屏幕结果,示例中省略变量声明:
/* 第一个格式示例 */
puts("输入:");
scanf("%[abc]",str); // 除abc三个字符外,其他字符均会结束对变量的赋值 puts("输出:");
printf("str = %s",str);
输入:
abcdef
输出:
str = abc
可以看到,scanf函数只读取了abc,这里d作为结束对变量str赋值的标志,后面的输入被忽略。
/* 第二个格式示例 */
puts("输入:");
scanf("%[^abc]",str); // abc三个字符均会结束对变量的赋值,其他任意字符都会被赋值给变量 puts("输出:");
printf("str = %s",str);
输入:
defabc
输出:
str = def
上述示例,scanf函数将a作为结束对变量str赋值的标志,同样忽略后面的输入。
若是想代表所有字母或数字,不必要输入所有的字母和数字,只需使用破折号来代表一定的范围即可,例如:
a-z 代表从a到z的26个小写字母
A-Z 代表从A到Z的26个大写字母
c-z 代表从c到z的24个小写字母
0-9 代表从0到9的10个数字
综合上述的用法,就可解决那三个问题,在这就不给出示例。
后话
scanf函数对于字符串的输入,存在着许多的问题,所以需要我们注意这些细节性的问题。
最后,非常感谢Darkleafin、阿胜4K指出文章中的错误。
scanf函数之扫描集的更多相关文章
- C语言scanf函数详细解释
原文链接 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准 ...
- C语言scanf函数详解
函数名: scanf 功 能: 运行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设 ...
- C语言中scanf函数的实现
接上一篇C语言中可变参数函数实现原理,从理论上详细介绍了C语言中可变参数函数的实现,这一篇从minix内核源码中的scanf函数入手,学习C语言经典可变参数函数的实现过程 在scanf.c文件中,可以 ...
- 【ACM非算法部分】scanf()函数
scanf函数 格式说明符: %c 字符型 %d 十进制数 %i 读入十进制,八进制,十六进制数.输入的时候正常是十进制数,若输入0前缀的数将读入八进制,0x前缀读入16进制.若输 ...
- scanf()函数
Scanf函数攻略: (A) 格式化说明符 格式字符 说明 %d 读入十进制整数 %u ...
- scanf函数详解
函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]);scanf()函数是通用终端格式化输入函数,它从标准输入设备(键 ...
- C语言中关于scanf函数的用法
scanf()函数的控制串 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化 ...
- scanf函数具体解释与缓冲区
1.基本信息 函数原型: int scanf( char *format, args, ...); 函数返回值: 读入并赋给args的数据个数.遇到文件结束返回EOF,出错返回0. 函数功能: sca ...
- C语言scanf函数详细解释(转载)
原文地址:https://blog.csdn.net/21aspnet/article/details/174326 scanf 函数名: scanf 功 能: 执行格式化输入 用 法: int sc ...
随机推荐
- 一起学 Java(四) File、Try 、序列化、MySQL、Socket
一.Java 流(Stream).文件(File)和IO Java.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io 包中的流支持很多种格式,比如:基 ...
- KB奇遇记(10):终章
本来还想写一篇关于前CIO的著名言论,不过想想还是算了.博客空间宝贵,不乱恶心人了. 这篇博文是本系列<KB奇遇记>的最后一篇了. 虽然在KB公司有这么多的苦,但毕竟收获也很多,至少让我懂 ...
- js阻止表单提交的两种方法
下面直接看代码. <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- pom.xml配置详解
<!--可以免费转载,转载时请注明出处 http://pengqb.iteye.com .--><project xmlns="http://maven.apache.o ...
- PLSQL触发器
触发器权限 数据库创建用户时想要在本用户下使用触发器,需要给用户触发器的权限 使用DBA用户执行 GRANT CREATE TRIGGER TO user_name; 如果想在当前用户下创建其他用户 ...
- Oracle instant client在windows下的安装和使用
安装 * 从oracle官方网站下载instant client文件,一般来说,有basic.sqlplus.odbc.jdbc,就足够用的了: instantclient-basic-win32-1 ...
- Java LinkedList特有方法程序小解 && 使用LinkedList 模拟一个堆栈或者队列数据结构。
package Collection; import java.util.LinkedList; /* LinkedList:特有的方法 addFirst()/addLast(); getFirst( ...
- protocol error, got 'n' as reply type byte
centos6.5上安装redis3.2版本,本地访问redis报错protocol error, got 'n' as reply type byte 解决办法 在redis配置文件redis.co ...
- angular.js学习笔记:实现商品价格计算实例
<!DOCTYPE html> <html lang="en" ng-app> <!-- ng-app:初始化的指令 也可以解析局部--> &l ...
- Finding distance between two curves
http://answers.opencv.org/question/129819/finding-distance-between-two-curves/ 问题: Hello, Im trying ...