下位机json信息解析方案:sscanf方法
这个方案只适用于解析少量的以字符串形式存在的json信息。
sscanf函数存在于c标准库stdio.h,是用于格式化解析的一个库函数,可以方便的解析我们想要的传递的信息。
sscanf更加高级的地方在于它支持正则表达式。
一、基本操作
直接看代码的话相信很好理解,像scanf格式化输入一样,这里我们格式化解析。
#include <stdio.h>
int main(){
int a; float b; char c;
char s[100];
char s1[]="a=100,b=3.14,c=@,s=Hello";
sscanf(s1,"a=%d,b=%f,c=%c,s=%s",&a,&b,&c,s);
printf("a=%d\n",a);
printf("b=%g\n",b);
printf("c=%c\n",c);
printf("s=%s\n",s);
return 0;
}
二、在解析中遇到的问题
1.遇到双引号
// {"NAME":"VAL"}
char s1[] = "{\"NAME\"=\"VAL \"}“
sscanf(s1, "{\"NAME\"=\"%s \"}",s);
在解析的字符串内遇到双引号用 \“ 代替
2.遇到空格
在下位机接受的json格式的信息里面的对应位置也加上空格,否则便会出现解析错误
// {"NAME":"VAL "}
char s1[] = "{\"NAME\"=\"VAL \"}“
sscanf(s1, "{\"NAME\"=\"%s \"}",s);
还是这一段代码,如果VAL后面不加空格则会出现解析错误,这里非常容易错的地方是自以为解析格式正确了,但是还是有错误。很多该加空格的地方并没有添加。
3.字符串解析必须以空格结尾
这个例子又出现了,如果解析VAL这个字符串并没有以字符串结尾那会出现什么情况呢,在这个例子里面他是正确的,没错,是正确的。
// {"NAME":"VAL "}
char s1[] = "{\"NAME\"=\"VAL \"}“
sscanf(s1, "{\"NAME\"=\"%s \"}",s);
但是在这个例子里面,就出错了,你会发现s字符串解析为““Hello”,a=100,b=3.14,c=@”,而abc是一个随机的数字
,这是因为字符串以0作为它的结尾,如果找不到这个0,那他将一直解析下去,把整个字符串解析完。abc找不到自己的值,是一个乱码(也许是读内存读到了一个随机的位置)。
#include <stdio.h>
int main(){
int a; float b; char c;
char s[100];
char s1[]="s=\"Hello\",a=100,b=3.14,c=@";
sscanf(s1,"s=%s,a=%d,b=%f,c=%c",s,&a,&b,&c);
printf("a=%d\n",a);
printf("b=%g\n",b);
printf("c=%c\n",c);
printf("s=%s\n",s);
return 0;
}
4.注意
解析过程中字符串必须一一匹配
常用的格式化字符:
%d整型输出
%ld长整型输出,
%o以八进制数形式输出整数,
%x以十六进制数形式输出整数,或输出字符串的地址。
%u以十进制数输出unsigned型数据(无符号数)。注意:%d与%u有无符号的数值范围,也就是极限的值,不然数值打印出来会有误。
%c用来输出一个字符,
%s用来输出一个字符串,
%f用来输出实数,以小数形式输出,默认情况下保留小数点6位。
%.100f用来输出实数,保留小数点100位。
%e以指数形式输出实数,
%g根据大小自动选f格式或e格式,且不输出无意义的零。