sscanf /fscanf 解析带空格字符串时的一点注意

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#

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值