sscanf()函数中format问题

sscanf() -格式化输入(从指定字符串中把符合指定格式的数据存放到对相应的参数中)

函数原型: 
int fscanf ( FILE *stream, char const *format, . . . );
int sscanf( string str, string format, mixed var1, mixed var2 ... ); 
int scanf( const char *format [,argument]... );
说明:
返回值:失败返回0 ,否则返回格式化的参数个数
f-file; s-string 
fscanf():以指定文件为输入源
sscanf():以固定字符串为输入源
scanf():以标准(stdin)为输入源,默认输入设备键盘 
其中的format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}
支持集合操作: (集合默认处理字符串后不用加s)
     %[a-z] 结果只保存a到z中任意字符 
     %[aB'] 匹配a、B、'中一员
     %[^a] 匹配从字符串开始到非a的任意字符
     %*[a-z]
其中集合操作也支持*过滤。
  {h|I|I64|L}:参数的size,通常h表示单字节size,I表示2字节 size,
  L表示4字节size(double例外),l64表示8字节size。
例子: 
1. 常见用法。 
    char buf[512] = {0}; 
    sscanf("123456 ", "%s", buf); 
    printf("%s\n", buf); 
结果为:123456  | sscanf=1;
2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。 
    sscanf("123456 ", "%4s", buf); 
    printf("%s\n", buf); 
结果为:1234     |sscanf=1
3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。 
    sscanf("123456 abcdedf", "%[^ ]", buf); 
    printf("%s\n", buf); 
结果为:123456     |sscanf=1

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

5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。 
    sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf); 
    printf("%s\n", buf); 
结果为:123456abcdedf       |sscanf=1
下面这个还有意思仔细理解下:
6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中 
    sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf); 
    printf("%s\n", buf); 
结果为:12DDWDFF      |sscanf=1
    sscanf("iios/12DDWDFF@122", "%[^/]/%[^@]", buf1,buf2); 
    printf("%s\n", buf1); 
    printf("%s\n", buf1);
结果:buf1=iios ;
         buf2=/12DDWDFF       | sscanf=2
由此我们可以得出结论,format中格式符%是从前一个格式符%处理到的字符下一个字符开始处理字符串,而不是从新开始处理字符串。
7、给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格)
    sscanf(“hello, world”, "%*s%s", buf);   
    printf("%s\n", buf); 
结果为:world       |sscanf=1
%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了 
如果没有空格则结果为NULL。 
8、 
char *s="1try234delete5" 
则: 
sscanf(s, "1%[^2]234%[^5]", s1, s2);     |sscanf=2
scanf的format中出现的非转换字符(%之前或转换字符之后的字符),即此例中的1234用来跳过输入中的相应字符; 
‘[]’的含义与正则表达式中相同,表示匹配其中出现的字符序列;^表示相反。使用[ ]时接收输入的变量必须是有足够存储空间的char、signed char、unsigned char数组。记住[也是转换字符,所以没有s了。
8、分割以某字符标记的字符串。()
char test[]="111,222,333,444,555,666,777"; 
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\n",s1); 
printf("sssa2=%s\n",s2); 
printf("sssa3=%s\n",s3); 
printf("sssa4=%s\n",s4); 
printf("sssa5=%s\n",s5); 
printf("sssa6=%s\n",s6); 
printf("sssa7=%s\n",s7); 
9、fprintf(fp,"%s %s",a,b);  读取两个字符串分别赋值给a,b
     fprintf(fp,"%s,%s",a,b);  读取一个字符串然后按format赋值给a,但是b的值不定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章