前言

  %[]是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函数之扫描集的更多相关文章

  1. C语言scanf函数详细解释

    原文链接 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准 ...

  2. C语言scanf函数详解

    函数名: scanf  功 能: 运行格式化输入  用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设 ...

  3. C语言中scanf函数的实现

    接上一篇C语言中可变参数函数实现原理,从理论上详细介绍了C语言中可变参数函数的实现,这一篇从minix内核源码中的scanf函数入手,学习C语言经典可变参数函数的实现过程 在scanf.c文件中,可以 ...

  4. 【ACM非算法部分】scanf()函数

    scanf函数 格式说明符: %c    字符型 %d    十进制数 %i     读入十进制,八进制,十六进制数.输入的时候正常是十进制数,若输入0前缀的数将读入八进制,0x前缀读入16进制.若输 ...

  5. scanf()函数

    Scanf函数攻略: (A)                格式化说明符 格式字符           说明 %d                 读入十进制整数 %u                 ...

  6. scanf函数详解

    函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]);scanf()函数是通用终端格式化输入函数,它从标准输入设备(键 ...

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

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

  8. scanf函数具体解释与缓冲区

    1.基本信息 函数原型: int scanf( char *format, args, ...); 函数返回值: 读入并赋给args的数据个数.遇到文件结束返回EOF,出错返回0. 函数功能: sca ...

  9. C语言scanf函数详细解释(转载)

    原文地址:https://blog.csdn.net/21aspnet/article/details/174326 scanf 函数名: scanf 功 能: 执行格式化输入 用 法: int sc ...

随机推荐

  1. 关于pandas精度控制

    最近使用pandas处理一批数据,数据中包含几个columns,它们的数据精度,例如 3.25165,1451684684168.0,0.23 处理完之后保存csv时发现,1451684684168. ...

  2. jquery 实现table的动态合并列

    常见的table是一行一列的形式,当有时会遇到后台的数据在前台显示时, 需要显示多对一,eg: 这是后台初始的数据,现在我要显示为: 思路:将第3列的td的rowspan改为为行数, 删除第一行之外的 ...

  3. ADO.NET 防止SQL注入

    规避SQL注入 如果不规避,在黑窗口里面输入内容时利用拼接语句可以对数据进行攻击 如:输入Code值 p001' union select * from Info where '1'='1 //这样可 ...

  4. 免越狱tweak应用逆向开发

    对于已越狱的设备,系统默认安装了mobilesubstrate动态库,提供一个系统级的入侵管道,所有的tweak都可以依赖它来进行开发.而对于没有越狱的手机,我们需要向目标app注入libsubstr ...

  5. 单页应用SPA的路由

    关于单页应用 单页Web应用(single page web application,SPA),就是只有一张Web页面的应用,是加载单个HTML 页面并在用户与应用程序交互时动态更新该页面的Web应用 ...

  6. 内网穿透+VS2015自带IIS express实现本地调试(微信等需要将开发环境暴漏到外网的情况使用)

    今天一个兼职结束了,又要开始寻找新的兼职公司了 ,为了贴补家用啊,为了给儿子更好的生活加油! 抒情完毕进入正题,本篇文章要解决的问题是其实在开发微信支付,微信公众号等回调地址必须是外网可访问的80端口 ...

  7. phpcms 列表项 内容项

    根据上一篇内容继续 首页替换完成后 接下来替换列表页 首先把列表的静态网页放入相应模板的content文件夹下,并改名为 list.html 并且创建栏目时选择下面一项 同样,头尾去掉,利用{temp ...

  8. C++inserter

    C++的迭代器适配器中常用的有插入迭代器(Inser Iterator).流迭代器(Stream Iterator)和逆向迭代器(Reverse Iterator)等! 本文主要是介绍插入迭代器(In ...

  9. Codeforce 水题报告

    最近做了好多CF的题的说,很多cf的题都很有启发性觉得很有必要总结一下,再加上上次写题解因为太简单被老师骂了,所以这次决定总结一下,也发表一下停课一星期的感想= = Codeforces 261E M ...

  10. PC端Web项目开发流程

    从前一直再做前端,突然想到如果有一天领导让自己独立承担一个web 项目的话是否有足够的能力去接这个任务,要学会自己去搭建一些基础的工具信息.所有的这一切在心里都要有个大致的流程,不然真正做的时候难免会 ...