Chinaunix首页 | 论坛 | 博客
  • 博客访问: 418529
  • 博文数量: 47
  • 博客积分: 1669
  • 博客等级: 上尉
  • 技术积分: 585
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-04 23:27
文章分类

全部博文(47)

文章存档

2011年(23)

2010年(24)

分类: C/C++

2010-10-24 22:36:01

    sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。sscanf可以实现更丰富的功能,最起眼的应该是类似于正则表达式的功能:
    第一个参数可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}  
    1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)   
    2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。   
    3、width表示读取宽度。   
    4、{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。   
    5、type :这就很多了,就是%s,%d之类。   6、特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值。

    同时,sscanf支持集合操作,
    %[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)
    %[aB'] 匹配a、B、'中一员,贪婪性
    %[^a] 匹配非a的任意字符,贪婪性
   
    1. 常见用法。   
    char buf[20] = ;   
    sscanf("abcd45", "%4s", buf);
    printf("%s\n", buf);   
结果为:abcd   

2. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。   
    sscanf("123abcd abcd1234", "%[^ ]", buf);   
    printf("%s\n", buf);   
    结果为:123456   
3. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。      
    sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);   
    printf("%s\n", buf);   
    结果为:123456abcdedf   
4. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。    
    sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);   
    printf("%s\n", buf);   
    结果为:123456abcdedf   
5、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中   
    sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);  
   printf("%s\n", buf);   结果为:12DDWDFF   
6、给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格)   
    sscanf(“hello, world”, "%*s%s", buf);   
    printf("%s\n", buf);   
    结果为:world  
   %*s表示第一个匹配到的%s被过滤掉,即hello被过滤了   如果没有空格则结果为NULL。   sscanf的功能很类似于正则表达式, 但却没有正则表达式强大,所以如果对于比较复杂的字符串处理,建议使用正则表达式.
  
阅读(2570) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-10-25 16:19:52

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com