sccanf函数

sccanf 函数跟用正则表达式处理数据很像。

函数原型: 
Int sscanf( string str, string fmt, mixed var1, mixed var2 ... ); 
int scanf( const char *format [,argument]... );
说明: 
sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。 
其中的format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}
 
支持集合操作: 
     %[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配) 
     %[aB'] 匹配a、B、'中一员,贪婪性 
     %[^a] 匹配非a的任意字符,贪婪性
 
例子: 
1. 常见用法。 
    char buf[512] = {0}; 
    sscanf("123456 ", "%s", buf); 
    printf("%s\n", buf); 
结果为:123456
2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。 
    sscanf("123456 ", "%4s", buf); 
    printf("%s\n", buf); 
结果为:1234
3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。 
    sscanf("123456 abcdedf", "%[^ ]", buf); 
    printf("%s\n", buf); 
结果为:123456 

4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。 
    sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf); 
    printf("%s\n", buf); 
结果为:123456abcdedf 

5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。 
    sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf); 
    printf("%s\n", buf); 
结果为:123456abcdedf
6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中 
    sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf); 
    printf("%s\n", buf); 
结果为:12DDWDFF 

7、给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格)
    sscanf(“hello, world”, "%*s%s", buf);   
    printf("%s\n", buf); 
结果为:world 
%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了 
如果没有空格则结果为NULL。 
8、 
char *s="1try234delete5" 
则: 
sscanf(s, "1%[^2]234%[^5]", s1, s2); 
scanf的format中出现的非转换字符(%之前或转换字符之后的字符),即此例中的1234用来跳过输入中的相应字符; 
‘[]’的含义与正则表达式中相同,表示匹配其中出现的字符序列;^表示相反。使用[ ]时接收输入的变量必须是有足够存储空间的char、signed char、unsigned char数组。记住[也是转换字符,所以没有s了。
8、分割以某字符标记的字符串。
char test[]="222,333,444,,,555,666"; 
char s1[4],s2[4],s3[4],s4[4],s5[4],s6[4],s7[4]; 
sscanf(test,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,]",s1,s2,s3,s4,s5,s6,s7); 
printf("sssa1=%s",s1); 
printf("sssa2=%s",s2); 
printf("sssa3=%s",s3); 
printf("sssa4=%s",s4); 
printf("sssa5=%s",s5); 
printf("sssa6=%s",s6); 
printf("sssa7=%s",s7); 
9、一个提取用户个人资料中邮件地址的例子 
#include<cstdlib> 
#include<cstdio> 
using namespace std; 
int main() 

    char a[20]={0}; 
    char b[20]={0}; 
    //假设email地址信息以';'结束 
    sscanf("email:jimmywhr@gmail.com;","%*[^:]:%[^;]",a); 
    //假设email地址信息没有特定的结束标志 
    sscanf("email:jimmywhr@gmail.com","%*[^:]:%s",b); 
    printf("%s\n",a); 
    printf("%s\n",b); 
    system("pause"); 
    return 0; 

关键是"%*[^:]:%[^;]"和"%*[^:]:%s"这两个参数的问题 
%*[^:]    表示满足"[]"里的条件将被过滤掉,不会向目标参数中写入值。这里的意思是在 
            第一个':'之前的字符会在写入时过滤掉,'^'是表示否定的意思,整个参数翻译 
            成白话就是:将在遇到第一个':'之前的(不为':'的)字符全部过滤掉。 
:         自然就是跳过':'的意思。 
%[^;]     拷贝字符直到遇到';'。
posted @ 2013-05-30 15:23  楼上人  阅读(933)  评论(0)    收藏  举报