当前位置: 首页 > 图文教程 > 开发语言 > C/C++ > 浅析scanf()函数中%[]格式控制符

C/C++
VC++ SMTP协议电子邮件传送剖析
Managed C++设计新邮件检查器
解决两个难懂的安全性问题
高级扫描技术及原理介绍
VC的另类数据库编程
Visual C++6.0 API函数操作技巧集
托盘编程全接触
在Visual C++中使用内联汇编
理解 Visual C++ Extensions for ADO
TCP/IP Winsock编程要点
VC打造自己特色的屏幕保护
Windows Sockets API实现网络异步通讯
程序界面多模式显示的实现
VC++6.0中控制运行唯一实例
WDM驱动程序设计之编译安装篇
VC编程中如何操作数据库中的图像字段
Windows 9X硬件中断设备驱动程序的开发
用控件聚合技术为FlexGrid增添PickList功能
用ATL和MFC来创建ActiveX控件
用VC进行COM编程所必须掌握的理论知识

C/C++ 中的 浅析scanf()函数中%[]格式控制符


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 388 ::
收藏到网摘: n/a

今天遇到scanf的%[]控制符,以前没留意过,查了下资料,就其使用总结了下,发布到软晨学习网网站上希望对大家有所帮助。

    基本格式为 %[scanset],表示将接收一个指定格式的字符串,其中scanset为要接受的字符集合。

    这种scanset有两种形式:一种是以非“^”字符开头的scanset,表示在读入字符串时将匹配所有在scanset中出现的字符,遇到非 scanset中的字符时输入结束;另外一种形式是以“^”字符开头的scanset,表示在读入字符串时将匹配所有不在scanset中出现的字符,遇到scanset中的字符输入结束。

    对于scanset,其可以是一些字符的简单拼凑,如“dlza#i”表示只匹配“dlza#i”中的字符,如输入为“ai#dcad”时得到的结果为 “ai#d”(c不匹配,结束);又如,“^290#*”表示匹配不在其中的字符(注意开头为^),所以同样的输入“ai#dcad”得到结果 “ai”(#不匹配,结束)。

    “-”字符的使用。当“-”出现在scanset中且两边都有字符时,标准没有对其行为进行规定,但大多数编译器都做了如下所述实现:“-”表示匹配从其左边的字符到右边字符之间所有的字符(按ASCII码排序)。如a-z表示a到z的所有字符,即abcd……yz,又如0-9表示0到9这十个数字。所以,当scanset为0-9时表示只匹配数字串,当scanset为A-Za-z时表示只匹配字符(包括大小写),当scanset为^0-9时不匹配所有数字。注意,“-”的字符只有在其左右两边都有有效字符时才有这个作用,否则被认为是普通字符,如“a-c-e-g”匹配的字符为{a, b, c, -, e, f, g},这样也为输入“-”字符提供了方法。

    特殊情况的处理。(1)当要匹配字符“^”时,由于不能放在开头(如前所述,有其特殊含义),可以将其放在其它位置,如scanset为 “adk[]^123”时表示仅匹配“adk[]^123”中的字符(可以是“^”了^_^)。(2)当要匹配右方括号“]”时,应把其放在 scanset中第一个位置,如“%[]abc]”表示匹配的字符集为{], a, b, c},又如“%[^]abc]”表示匹配所有非{], a, b, c}中的字符。

    测试代码如下:

    (在VC6.0及MinGW2.05中测试通过)
 

 #include <stdio.h>
#include <string.h>

int main()

{
    char buf[100];
    char tmp[100];
    memset(buf, 0, 100);
    memset(tmp, 0, 100);
    strcpy(buf, "ai#dcad");
    sscanf(buf, "%[dlza#i]", tmp);
    printf("%s\n", tmp); //output should be: ai#d

    memset(tmp, 0, 100);
    sscanf(buf, "%[^290#*]", tmp);
    printf("%s\n", tmp); //output should be: ai

    memset(tmp, 0, 100);
    strcpy(buf, "abd0123DEF##ADD");
    sscanf(buf, "%[0-9a-zA-Z]", tmp);
    printf("%s\n", tmp); //output may be: adb0123DEF

    memset(tmp, 0, 100);
    strcpy(buf, "#^#%-dc9001DGD");
    sscanf(buf, "%[^0-9a-zA-Z]", tmp);
    printf("%s\n", tmp); //output may be: #^#%- memset(tmp, 0, 100);

    strcpy(buf, "-abce]fgdd"); sscanf(buf, "%[]a-c-e-g]", tmp);
    printf("%s\n", tmp); //output should be: -abce]fg

    memset(tmp, 0, 100); sscanf(buf, "%[^]]", tmp);
    printf("%s\n", tmp); //output should be: -abce

 

    return 0;

}