1,sscanf 和fscanf 函数
fscanf ()函数:
功 能: 从一个流中执行格式化输入,fscanf遇到空格和换行时结束。
sscanf ()函数:
功 能: 格式化解析字符串,同样sscanf遇到空格和换行时结束。
2,解析带空格的数据遇到的问题
#include <stdio.h>
#include <string.h>
//vim Status.file ==> GooD LucK
int main()
{
char buf[20] ={0};
char sbuf[50] ={"GOOD LUCK"};
char tmpbuf[50] = {0};
FILE *fp = fopen("./Status.file","r+");
if(fp != NULL)
{
fscanf( fp, "%s", buf);
}
printf("buf = [%s] \n", buf);
sscanf( sbuf,"%s", tmpBuf );
printf("tmpbuf = [%s] \n", tmpbuf);
return 0;
}
/*
[root@hero work]# ./a.out
buf = [GOOD]
tmpbuf = [GOOD]
*/
结果:
只解析了GOOD,没有达到全部解析的目的,这是跟这两个函数上面的描述信息一致,所以在本例中只能解析到GOOD
2,对该代码的优化,使其能解析带空格的字符串
#include <stdio.h>
#include <string.h>
//vim Status.file ==> GooD LucK
int main()
{
char buf[20] ={0};
char sbuf[50] ={"GOOD LUCK"};
char tmpbuf[50] = {0};
char tbuf[50]="(hello world)";
FILE *fp = fopen("./Status.file","r+");
if(fp != NULL)
{
fscanf( fp, "%[^\n]", buf);
}
printf("buf = [%s] \n", buf);
sscanf( sbuf,"%[^\n]", tmpbuf );
printf("tmpbuf = [%s] \n", tmpbuf);
char stbuf[56]={0};
sscanf( tbuf,"(%[^)]" , stbuf);
printf("stbuf = [%s] \n", stbuf);
return 0;
}
/*
[root@hero work]# ./a.out
buf = [GOOD LucK]
tmpbuf = [GOOD LUCK]
stbuf = [hello world]
*/
结果:很显然达到了我们的预期,这里使用了一下简单的正则表达式。
3,解析fscanf/sscanf函数中正则表达式的解析
fscanf 和 sscanf都可以 使用简单的正则表达式
如:
% 代表选择,后跟相应条件
%* 代表过滤(即连续匹配满足条件的字符,并丢弃)
%及%* 后面紧跟的数字代表匹配的字符个数
例子:
%*[^(] 连续匹配非左括号字符First 并丢弃之,遇到左括号停止
( 匹配并丢弃左括号
%[^)] 连续匹配非右括号字符helloWorld(遇到右括号停止)并赋值给str
%5[^)] 限定只匹配5个字符
char buf[50]="(hello world)";
sscanf( buf,"(%[^)])" , sbuf);
上面的代码中解析的sscanf fscanf函数可以进行优化:
"%s" 替换为正则 "%[^\n]" (连续选择非\n的字符,就可以做到将GOOD LUCK解析出来)
4,总结
总结:
注意fscanf和sscanf解析时,遇到'\0' 或 '\n',函数返回(停止解析)
通过简单的正则表达式达到我们的目的
sscanf(buf,"%*[^:]%[^#]",h)
:=>
连续匹配非':'的字符并丢弃,遇到':'结束,再次匹配非'#'并赋值给h
可用于解析==》Name:123456#