当前位置: 首页 > 图文教程 > 开发语言 > C/C++ > 浅析scanf()函数中%[]格式控制符
今天遇到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> int main() { memset(tmp, 0, 100); memset(tmp, 0, 100); memset(tmp, 0, 100); strcpy(buf, "-abce]fgdd"); sscanf(buf, "%[]a-c-e-g]", tmp); memset(tmp, 0, 100); sscanf(buf, "%[^]]", tmp);
return 0; } |
评论 (0) All