char 数组中不需要的文本
Unwanted text inside char array
我正在尝试 "hard code" 一个非常小的 JSON C 语言解析器用于一个小项目,我遇到了两个主要问题:
字符串输出包含一些不知从何而来的不需要的文本(实际上它是 getaddrinfo() 的手册页中的描述,我不知道它是如何到达那里的)。这是我得到的输出:
3484. The default is:
#
#precedence ::1/128 50
#precedence ::/0 40
#precedence 2002::/16 30
#precedence ::/96 20
#precedence ::ffff:0:0/96 10
#
# For sites which prefer IPv4 connections change the last line to
#
#precedence ::ffff:0:0/96 100
#
# scopev4 <mask> <value>
# Add another rule to the RFC 6724 scope table for IPv4 addresses.
# By default the scope IDs described in section 3.2 in RFC 6724 are
# used. Changing these defaults should hardly ever be necessary.
# The defaults are equivalent to:
#
#scopev4 ::ffff:169.254.0.0/112 2
#scopev4 ::ffff:127.0.0.0/104 2
#scopev4 ::ffff:0.0.0.0/96 14
{id_src:103,accel_x:101,accel_y:114,accel_z:116,temp:101} <-- This is the only
wanted section !
我遇到的第二个问题是,当我尝试将两个结构解析为 json 时,嗯,json 有点附加两个结构:
... The usual unwanted data before
{id_src:103,accel_x:101,accel_y:114,accel_z:116,temp:101}{$ûrc:1id_src:103,accel_x:101,accel_y:114,accel_z:116,temp:101}
我尝试减少分配的 space 结果发现 free() 出错,因为分配的 char 数组的大小发生了变化。这也是我不太理解的奇怪行为。
这是代码:
... some code here
char* jsonData = malloc(1048*sizeof(char));
strcat(jsonData,"{");
char* champsTab[] = {"id_src","accel_x","accel_y","accel_z","temp"};
char* buff=malloc(1024*sizeof(char));
for(i=0;i<5;i++) {
strcat(buff,champsTab[i]);
char* data=malloc(4*sizeof(char));
switch(i) {
case 0:
sprintf(data,":%d,",capteurs->id_src);
strcat(buff,data);
break;
case 1:
sprintf(data,":%d,",capteurs->accel_x);
strcat(buff,data);
break;
case 2:
sprintf(data,":%d,",capteurs->accel_y);
strcat(buff,data);
break;
case 3:
sprintf(data,":%d,",capteurs->accel_z);
strcat(buff,data);
break;
case 4:
sprintf(data,":%d",capteurs->temp);
strcat(buff,data);
break;
}
free(data);
}
strcat(jsonData,buff);
strcat(jsonData,"}");
printf("%s\n",jsonData);
free(jsonData);
free(buff);
return 0;
}
问题很可能是这两行:
char* jsonData = malloc(1048*sizeof(char));
strcat(jsonData,"{");
当您使用 malloc
分配内存时,它不会被初始化。内容将是 不确定的 并且看似随机。因此,strcat
寻找结尾的字符串终止符很有可能不是内存中的第一个元素。它甚至可能根本不在分配的内存中。
对此有一个简单的解决方案:使用 strcpy
而不是 strcat
:
strcpy(jsonData,"{");
您稍后遇到与 buff
完全相同的问题。
我正在尝试 "hard code" 一个非常小的 JSON C 语言解析器用于一个小项目,我遇到了两个主要问题: 字符串输出包含一些不知从何而来的不需要的文本(实际上它是 getaddrinfo() 的手册页中的描述,我不知道它是如何到达那里的)。这是我得到的输出:
3484. The default is:
#
#precedence ::1/128 50
#precedence ::/0 40
#precedence 2002::/16 30
#precedence ::/96 20
#precedence ::ffff:0:0/96 10
#
# For sites which prefer IPv4 connections change the last line to
#
#precedence ::ffff:0:0/96 100
#
# scopev4 <mask> <value>
# Add another rule to the RFC 6724 scope table for IPv4 addresses.
# By default the scope IDs described in section 3.2 in RFC 6724 are
# used. Changing these defaults should hardly ever be necessary.
# The defaults are equivalent to:
#
#scopev4 ::ffff:169.254.0.0/112 2
#scopev4 ::ffff:127.0.0.0/104 2
#scopev4 ::ffff:0.0.0.0/96 14
{id_src:103,accel_x:101,accel_y:114,accel_z:116,temp:101} <-- This is the only
wanted section !
我遇到的第二个问题是,当我尝试将两个结构解析为 json 时,嗯,json 有点附加两个结构:
... The usual unwanted data before
{id_src:103,accel_x:101,accel_y:114,accel_z:116,temp:101}{$ûrc:1id_src:103,accel_x:101,accel_y:114,accel_z:116,temp:101}
我尝试减少分配的 space 结果发现 free() 出错,因为分配的 char 数组的大小发生了变化。这也是我不太理解的奇怪行为。
这是代码:
... some code here
char* jsonData = malloc(1048*sizeof(char));
strcat(jsonData,"{");
char* champsTab[] = {"id_src","accel_x","accel_y","accel_z","temp"};
char* buff=malloc(1024*sizeof(char));
for(i=0;i<5;i++) {
strcat(buff,champsTab[i]);
char* data=malloc(4*sizeof(char));
switch(i) {
case 0:
sprintf(data,":%d,",capteurs->id_src);
strcat(buff,data);
break;
case 1:
sprintf(data,":%d,",capteurs->accel_x);
strcat(buff,data);
break;
case 2:
sprintf(data,":%d,",capteurs->accel_y);
strcat(buff,data);
break;
case 3:
sprintf(data,":%d,",capteurs->accel_z);
strcat(buff,data);
break;
case 4:
sprintf(data,":%d",capteurs->temp);
strcat(buff,data);
break;
}
free(data);
}
strcat(jsonData,buff);
strcat(jsonData,"}");
printf("%s\n",jsonData);
free(jsonData);
free(buff);
return 0;
}
问题很可能是这两行:
char* jsonData = malloc(1048*sizeof(char));
strcat(jsonData,"{");
当您使用 malloc
分配内存时,它不会被初始化。内容将是 不确定的 并且看似随机。因此,strcat
寻找结尾的字符串终止符很有可能不是内存中的第一个元素。它甚至可能根本不在分配的内存中。
对此有一个简单的解决方案:使用 strcpy
而不是 strcat
:
strcpy(jsonData,"{");
您稍后遇到与 buff
完全相同的问题。