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的值不定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值