表头文件 #include(stdio.h) 定义函数 int sscanf (const char *str,const char * format,........); 函数说明 sscanf() 会将参数 str 的字符串根据参数 format 字符串来转换并格式化数据。格式转换形式请参考 scanf() 。转换后的结果存于对应的参数内。 返回值 成功则返回参数数目,失败则返回 -1 ,错误原因存于 errno 中。
周星星的代码: #include <stdio.h> int main() { const char* s = "iios/12DDWDFF@122"; char buf[20]; sscanf( s, "%*[^/]/%[^@]", buf );//匹配/和@之间的字符串 printf( "%s/n", buf ); return 0; } 结果为 :12DDWDFF sscanf 与 scanf 类似,都是用于输入的,只是后者以屏幕 (stdin) 为输入源,前者以固定字符串为输入源。 | 函数原型: int scanf( const char *format [,argument]... ); 其中的 format 可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '/t' | '/n' | 非 % 符号 } , 注: {a|b|c} 表示 a,b,c 中选一, [d], 表示可以有 d 也可以没有 d 。 width: 宽度,一般可以忽略,用法如: const char sourceStr[] = "hello, world"; char buf[10] = {0}; sscanf(sourceStr, "%5s", buf); //%5s ,只取 5 个字符 cout << buf<< endl; 结果为 :hello {h | l | I64 | L}: 参数的 size, 通常 h 表示单字节 size , I 表示 2 字节 size,L 表示 4 字节 size(double 例外 ),l64 表示 8 字节 size 。 type : 这就很多了,就是 %s,%d 之类。 特别的: %*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值。如: const char sourceStr[] = "hello, world"; char buf[10] = {0}; sscanf(sourceStr, "%*s%s", buf); //%*s 表示第一个匹配到的 %s 被过滤掉,即 hello 被过滤了 cout << buf<< endl; 结果为 :world 支持集合操作: %[a-z] 表示匹配 a 到 z 中任意字符,贪婪性 ( 尽可能多的匹配 ) %[aB'] 匹配 a 、 B 、 ' 中一员,贪婪性 %[^a] 匹配非 a 的任意字符,贪婪性
1. 常见用法。 以下是引用片段: charstr[512]={0}; sscanf("123456","%s",str); printf("str=%s",str); 2. 取指定长度的字符串。如在下例中,取最大长度为 4 字节的字符串。 以下是引用片段: sscanf("123456","%4s",str); printf("str=%s",str); 3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。 以下是引用片段: sscanf("123456abcdedf","%[^ ]",str);//注意^后面有空格 printf("str=%s",str); 4. 取仅包含指定字符集的字符串。如在下例中,取仅包含 1 到 9 和小写字母的字符串。 以下是引用片段: sscanf("123456abcdedfBCDEF","%[1-9a-z]",str); printf("str=%s ",str); 5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。 以下是引用片段: sscanf("123456abcdedfBCDEF","%[^A-Z]",str); printf("str=%s",str); | 搜集一些特殊用法:
%[ ] 的用法: %[ ] 表示要读入一个字符集合 , 如果 [ 后面第一个字符是 ”^” ,则表示反意思。 [ ] 内的字符串可以是 1 或更多字符组成。空字符集( %[] )是违反规定的,可 导致不可预知的结果。 %[^] 也是违反规定的。 %[a-z] 读取在 a-z 之间的字符串,如果不在此之前则停止,如 char s[]="hello, my friend” ; // 注意 : , 逗号在不 a-z 之间 sscanf( s, “%[a-z]”, string ) ; // string=hello %[^a-z] 读取不在 a-z 之间的字符串,如果碰到 a-z 之间的字符则停止,如 char s[]="HELLOkitty” ; // 注意 : , 逗号在不 a-z 之间 sscanf( s, “%[^a-z]”, string ) ; // string=HELLO %*[^=] 前面带 * 号表示不保存变量。跳过符合条件的字符串。 char s[]="notepad=1.0.0.1001" ; char szfilename [32] = "" ; int i = sscanf( s, "%*[^=]", szfilename ) ; // szfilename=NULL, 因为没保存 int i = sscanf( s, "%*[^=]=%s", szfilename ) ; // szfilename=1.0.0.1001 %40c 读取 40 个字符 %[^=] 读取字符串直到碰到 ’=’ 号, ’^’ 后面可以带更多字符 , 如: char s[]="notepad=1.0.0.1001" ; char szfilename [32] = "" ; int i = sscanf( s, "%[^=]", szfilename ) ; // szfilename=notepad 如果参数格式是: %[^=:] ,那么也可以从 notepad:1.0.0.1001 读取 notepad | 参考: http://blog.csdn.net/beingstudio/articles/1806661.aspx http://hi.baidu.com/lbird/blog/item/07e09c8282dbe992f703a6b0.html http://hi.baidu.com/yinjianren/blog/item/28dce5ca75e30585c9176896.html |