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 完全相同的问题。