C语言:sscanf函数解析json

下位机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格式,且不输出无意义的零。
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LyaJpunov

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值