一、了解需要使用的C语言函数
1、strstr函数
用于在一个字符串中查找另一个字符串第一次出现的位置。
函数原型如下:
char *strstr(const char *haystack, const char *needle);haystack 是要搜索的字符串,needle 是要查找的子字符串。
函数返回一个指向第一次出现 needle 的位置的指针,如果没有找到则返回 NULL。
2、strcmp函数
一个字符串处理函数,用于比较两个字符串的大小关系。
函数原型如下:
int strcmp(const char *str1, const char *str2);其中 str1 和 str2 分别是要比较的两个字符串。
函数返回一个整数值,表示两个字符串的大小关系:
如果 str1 小于 str2,则返回一个负数。
如果 str1 等于 str2,则返回 0。
如果 str1 大于 str2,则返回一个正数。
3、strtok函数
用于将字符串分割成子字符串的函数,通常用于按照指定的分隔符将一个字符串拆分成多个部分。
函数原型如下:
char *strtok(char *str, const char *delim);str 是要分割的字符串,delim 是用来指定分隔符的字符串。
第一次调用 strtok 时,需要传入要分割的字符串 str,后续调用则传入 NULL。
每次调用 strtok 都会返回一个指向下一个子字符串的指针,直到字符串被完全分割。
4、atoi函数
用于将字符串转换为整数(int
类型)
函数原型如下:
int atoi(const char *str);str 是一个指向以 null 结尾的字符串的指针,表示要转换为整数的字符串。
atoi 函数会将输入的字符串转换为整数值,并返回转换后的整数。如果字符串的开头是数字字符(0-9),atoi 会从这个位置开始转换,直到遇到非数字字符为止。如果字符串的开头不是数字字符,则返回 0。
5、strcpy函数
将一个字符串拷贝到另一个字符串中
函数原型如下:
char *strcpy(char *dest, const char *src);dest 是目标字符串,即要将源字符串拷贝到的位置。
src 是源字符串,即要被拷贝的字符串。
strcpy 函数会将源字符串的内容复制到目标字符串中,直到遇到源字符串的结束符(\0)为止。
目标字符串必须足够大,以容纳源字符串的内容,否则可能会导致缓冲区溢出。
6、strchr函数
用于在字符串中查找指定字符的第一个匹配位置。
函数原型如下:
char *strchr(const char *str, int c);str 是要在其中查找字符的字符串。
c 是要查找的字符。
strchr 函数会在 str 指向的字符串中查找第一个匹配字符 c 的位置,并返回指向该位置的指针。
如果找到了匹配字符,返回的指针指向该字符;如果未找到匹配字符,返回空指针(NULL)。
二、编写代码获取JSON数据,方法1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>char str[300]= "{\"method\":\"thing.service.property.set\",\"id\":\"463160838\",\"params\":{\"Humidity\":25,\"temperature\":25,\"infor\":\"ijj\"},\"version\":\"1.0.0\"}";int humidity,temperature;
char infor[100];void parseJSON1(char *jsonData) {char *token = strtok(jsonData, "{},\":");while (token != NULL) {printf("%s\r\n",token);if (strcmp(token, "Humidity") == 0) {token = strtok(NULL, "{},\":");humidity = atoi(token);} else if (strcmp(token, "temperature") == 0) {token = strtok(NULL, "{},\":");temperature = atoi(token);} else if(strcmp(token, "infor") == 0){token = strtok(NULL, "{},\":");strcpy(infor,token);}token = strtok(NULL, "{},\":");}
}int main()
{parseJSON1(str);printf(" humidity %d\r\n",humidity);printf(" temperature %d\r\n",temperature);printf(" infor %s\r\n",infor);
}
切记:调用完parseJSON1(str);函数后str的值会被改变,所以我们应该先拷贝一份值,在传入
#include <stdio.h>
#include <stdlib.h>
#include <string.h>char str[300]= "{\"method\":\"thing.service.property.set\",\"id\":\"463160838\",\"params\":{\"Humidity\":25,\"temperature\":25,\"infor\":\"ijj\"},\"version\":\"1.0.0\"}";int humidity,temperature;
char infor[100];void parseJSON1(char* jsonData) {char *token = strtok(jsonData, "{},\":");while (token != NULL) {printf("%s\r\n",token);if (strcmp(token, "Humidity") == 0) {token = strtok(NULL, "{},\":");humidity = atoi(token);} else if (strcmp(token, "temperature") == 0) {token = strtok(NULL, "{},\":");temperature = atoi(token);} else if(strcmp(token, "infor") == 0){token = strtok(NULL, "{},\":");strcpy(infor,token);}token = strtok(NULL, "{},\":");}
}int main()
{char temp[200];strcpy(temp,str);parseJSON1(temp);printf(" humidity %d\r\n",humidity);printf(" temperature %d\r\n",temperature);printf(" infor %s\r\n",infor);
}
三、编写代码获取JSON数据,方法2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>char str[300]= "{\"method\":\"thing.service.property.set\",\"id\":\"463160838\",\"params\":{\"Humidity\":25,\"temperature\":25,\"infor\":\"ijj\"},\"version\":\"1.0.0\"}";int humidity,temperature;
char infor[100];void parseJSON2(char *jsonData) {char* softwareInfoStart = strstr(jsonData, "infor");if (softwareInfoStart != NULL) {softwareInfoStart += 8;char* softwareInfoEnd = strchr(softwareInfoStart, '"');if (softwareInfoEnd != NULL) {int length = softwareInfoEnd - softwareInfoStart;strncpy(infor, softwareInfoStart, length);infor[length] = '\0';}}
}int main()
{parseJSON2(str);printf(" humidity %d\r\n",humidity);printf(" temperature %d\r\n",temperature);printf(" infor %s\r\n",infor);
}
三、编写代码获取JSON数据,方法3
#include <stdio.h>
#include <string.h>int main() {char input[] = "{\"method\":\"thing.service.property.set\",\"id\":\"463160838\",\"params\":{\"Humidity\":25,\"temperature\":25,\"infor\":\"ijj\"},\"version\":\"1.0.0\"}";int id,humidity,temperature;char infor[100];sscanf(input, "{\"method\":\"thing.service.property.set\",\"id\":\"%d\",\"params\":{\"Humidity\":%d,\"temperature\":%d,\"infor\":\"%s\"},\"version\":\"1.0.0\"}",&id ,&humidity,&temperature,infor);//因为char型的地址是连续的,所以需要人为的加入\0结束符for(int i=0;;i++){if(infor[i]=='"'){infor[i]='\0';break;}}printf("humidity:%d\n", humidity);printf("temperature:%d\n", temperature);printf("infor:%s\n", infor);return 0;
}