int GetStrInBuf( char *profile, char *KeyName, char *KeyVal, int type) { char buf[512] = {0}; FILE *fp; char docat[128] = {0}; long profilelen; sprintf(docat, "nohup cat %s -> %s 0</dev/null", profile, TEMPTXT); system__popen(docat, NULL, 0); //printf("%s\n",docat); if( (fp=fopen( TEMPTXT,"r" ))==NULL ){ printf( "openfile [%s] error [%s]\n", profile, strerror(errno) ); return -1; } fseek(fp, 0, SEEK_END); profilelen = ftell(fp); fseek( fp, 0, SEEK_SET); fread(buf, 1, profilelen, fp); fclose(fp); char *json_str = (char *)malloc(strlen(buf)); strcpy(json_str, buf); struct json_object* json_obj = json_tokener_parse(json_str); // printf("Age: %d\n", json_object_get_int(json_object_object_get(json_obj, "age"))); memset(buf, 0x00, sizeof(buf)); if(type == 0) { strcpy(buf, json_object_get_string(json_object_object_get(json_obj, KeyName))); if(strlen(buf) == 0) { memset(KeyVal, 0x00, sizeof(KeyVal)); } else{ snprintf(KeyVal, (strlen(buf)+1), "%s", buf); printf("name:%s,valye:%s\n", KeyName, KeyVal); } } else { int str_value = json_object_get_int(json_object_object_get(json_obj, KeyName)); sprintf(KeyVal,"%d", str_value); printf("name:%s,valye:%s\n", KeyName, KeyVal); } memset(json_str, 0x00, sizeof(json_str)); free(json_str); json_object_put(json_obj); return 0; } int test(){ char buf_d[64]; memset(buf_d, 0x00, sizeof(buf_d)); GetStrInBuf(VTMP_JSON_CELL_INFO, "ipv4", buf_d, 0); char buf_a[64] = ""; memset(buf_a, 0x00, sizeof(buf_a)); GetStrInBuf(VTMP_JSON_CELL_INFO, "ipv6", buf_a, 0); if(strlen(buf_a) > 0) { char buf_c[128] = ""; memset(buf_c, 0x00, sizeof(buf_c)); sprintf(buf_c, "%s,%s",buf_d, buf_a); set_config_value(DATE_FILE,"gw5GIp",buf_c); } else{ set_config_value(DATE_FILE,"gw5GIp",buf_d); } printf("aa\n"); return 0; }
时间: 2024-03-20 08:43:53 浏览: 117
在代码中,我发现以下两行可能会导致段错误:
```
char *json_str = (char *)malloc(strlen(buf));
strcpy(json_str, buf);
```
这是因为 `malloc` 函数分配的内存大小应该为字符串长度加上1(用于存储字符串结束符 `\0`),因此应该改为:
```
char *json_str = (char *)malloc(strlen(buf) + 1);
strcpy(json_str, buf);
```
此外,还有一处问题可能会导致段错误:
```
memset(json_str, 0x00, sizeof(json_str));
```
这是因为 `json_str` 是指针类型,`sizeof(json_str)` 返回的是指针类型的大小,而不是指向的内存空间的大小。应该改为:
```
memset(json_str, 0x00, strlen(json_str) + 1);
```
这两处问题都涉及到了内存的操作,如果内存操作不当,就容易导致段错误。
相关问题
int GetStrInBuf( char *profile, char *KeyName, char *KeyVal, int type) { char buf[512] = {0}; FILE *fp; char docat[128] = {0}; long profilelen; sprintf(docat, "nohup cat %s -> %s 0</dev/null", profile, TEMPTXT); system__popen(docat, NULL, 0); //printf("%s\n",docat); if( (fp=fopen( TEMPTXT,"r" ))==NULL ){ printf( "openfile [%s] error [%s]\n", profile, strerror(errno) ); return -1; } fseek(fp, 0, SEEK_END); profilelen = ftell(fp); fseek( fp, 0, SEEK_SET); fread(buf, 1, profilelen, fp); fclose(fp); char *json_str = (char *)malloc(strlen(buf)); strcpy(json_str, buf); struct json_object* json_obj = json_tokener_parse(json_str); // printf("Age: %d\n", json_object_get_int(json_object_object_get(json_obj, "age"))); memset(buf, 0x00, sizeof(buf)); if(type == 0) { strcpy(buf, json_object_get_string(json_object_object_get(json_obj, KeyName))); snprintf(KeyVal, (strlen(buf)+1), "%s", buf); printf("name:%s,valye:%s\n", KeyName, KeyVal); } else { int str_value = json_object_get_int(json_object_object_get(json_obj, KeyName)); sprintf(KeyVal,"%d", str_value); printf("name:%s,valye:%s\n", KeyName, KeyVal); } memset(json_str, 0x00, sizeof(json_str)); free(json_str); json_object_put(json_obj); return 0; }
在这段代码中,我看不到任何明显的段错误。但是,由于该函数调用了 `malloc()`,所以存在内存泄漏的风险。在调用 `malloc()` 之后,需要在不再需要使用分配的内存时使用 `free()` 释放该内存。此外,该函数还使用了 `system()` 函数执行系统命令,这可能会导致安全问题。建议使用更安全的函数来执行系统命令,例如 `popen()`。
//从json str中取值,type,0:char;other:int int GetStrInBuf_x( char *json_str, char *Keygroup, char* Keyname,char *KeyVal, int type) { char buf[512] = {0}; char buf1[512] = {0}; FILE *fp; char docat[128] = {0}; long profilelen; printf("input1:%s %s %s\n", json_str, Keygroup, Keyname); struct json_object* json_obj = json_tokener_parse(json_str); const char* json_s = json_object_to_json_string(json_obj); printf("ss%s\n", json_s); struct json_object *person = json_object_object_get(json_obj, "data"); printf("ssss\n"); // printf("Age: %d\n", json_object_get_int(json_object_object_get(json_obj, "age"))); printf("p:%s\n", json_object_to_json_string(person)); memset(buf, 0x00, sizeof(buf)); if(type == 0) { strcpy(buf, json_object_get_string(json_object_object_get(person, Keyname))); if(strlen(buf) == 0) { memset(KeyVal, 0x00, sizeof(KeyVal)); } else{ snprintf(KeyVal, (strlen(buf)+1), "%s", buf); printf("name:%s,value_str:%s\n", Keyname, KeyVal); } } else { int str_value = json_object_get_int(json_object_object_get(person, Keyname)); sprintf(KeyVal,"%d", str_value); printf("name:%s,value_in:%s\n", Keyname, KeyVal); } memset(json_obj, 0x00, strlen(json_obj) + 1); json_object_put(json_obj); return 0; }
此函数可以实现从json字符串中取值,返回值为整型的时候可以取整型值,返回值为字符串的时候可以取字符串值。
该函数的具体实现过程如下:
1.调用json_tokener_parse函数将json字符串转换为json_object对象。
2.使用json_object_object_get函数获取json_object对象中指定键值(Keygroup)对应的值(person)。
3.使用json_object_object_get函数获取person对象中指定键值(Keyname)对应的值,并根据type参数的值判断返回的值是整型还是字符串类型。
4.将获取到的值存储到KeyVal参数中,并打印出来。
5.释放json_object对象的内存。
需要注意的是,在使用完json_object对象后,需要调用json_object_put函数释放该对象的内存,否则可能会出现内存泄漏的问题。
此外,由于该函数中使用了一些未定义的变量和函数,比如FILE *fp、long profilelen、memset等,因此需要在函数外部定义或使用已经定义过的变量和函数。
阅读全文