sscanf函数用法

函数sscanf与scanf功能相同(更多的是将它划为字符串分割函数),对于scanf,是从标准流输入读取字符,对于sscanf则是从字符串中读取字符,函数原型为:

int sscanf (char *s, const char * format, ...);

返回值为返回参数数目,失败则返回-1

第一个参数可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}

1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入(也就是不把此数据读入参数中) 。

2、width表示读取宽度,一般可忽略。

3、{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 ,size,L表示4字节size(double例外),l64表示8字节size。

4、type :是指%s,%d等修饰符

5、特别的:%*[width] [{h | l | I64 | L}]type  表示满足该条件的被过滤掉,不会向目标参数中写入值

支持集合操作:

  %[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)

  %[aB'] 匹配a、B、'中一员,贪婪性

  %[^a] 匹配非a的任意字符,贪婪性

具体应用:

1. 常见用法

  char buf[512] = {0};

  sscanf("123456 ", "%s", buf);    //此处buf是数组名,它的意思是将123456以%s的形式存入buf中

  printf("%s\n", buf);

   结果为:123456

2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。

  sscanf("123456 ", "%4s", buf);  // %4s 表示取前4个字符

  printf("%s\n", buf);

  结果为:1234

3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。

  sscanf("123456 abcdedf", "%[^ ]", buf);     // %[^ ] 表示匹配非空格的任意字符,函数读取到这里将结束

  printf("%s\n", buf);

  结果为:123456

4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。

  sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);   // %[1-9a-z]  表示匹配1-9和a-z中任意字符(区分大小写)

  printf("%s\n", buf);

  结果为:123456abcdedf

5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。

  sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);    // %[^A-Z] 表示不匹配A-Z中的任意字符

  printf("%s\n", buf);

  结果为:123456abcdedf

6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将"iios/"过滤掉,再将非'@'的一串内容送到buf中

  sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);    // "%*[^/]/"  是过滤掉iios/ 这部分内容,先看[^/]再结合看*/(中间的[^/]拿出来了)

  printf("%s\n", buf);

  结果为:12DDWDFF

7、给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格)

  sscanf(“hello, world”, "%*s%s", buf);    // %*s表示第一个匹配到的%s被过滤掉,即hello被过滤了,如果没有空格则结果为NULL。  

  printf("%s\n", buf);

  结果为:world

 

以上资料参考来自:http://baike.baidu.com/view/1364018.htm

posted @ 2010-10-04 23:43  jeff_nie  阅读(572)  评论(0编辑  收藏  举报