为什么json数据包含多余的字符

时间:2019-05-23 07:03:52

标签: c

在下面的代码中,当用以下命令打印“数据”时:

Display_printf(display, 0, 0, "score received: %.*s\n", ret, data);

json数据正确打印:

{"zip":97306,"score":130}

但是,当我这样做时:

Display_printf(display, 0, 0, "score received: %s\n", data);

json数据包含额外的字符(有时很奇怪/未知字符),如下所示:

{"zip":97306,"score":130}R

为什么第二种打印方法显示多余的字符,而第一种却没有?如何解决该问题,以便第二种打印方法有效?做“%。* s”以使数据可以存储正确的json数据的等效代码是什么?


do
{
    ret = HTTPClient_readResponseBody(httpClientHandle, data, sizeof(data),
                                      &moreDataFlag);
    if(ret < 0)
    {
        printError("httpTask: response body processing failed", ret);
    }
    Display_printf(display, 0, 0, "%.*s \r\n",ret,data);
    len += ret;
}
while(moreDataFlag);

2 个答案:

答案 0 :(得分:3)

我的 猜测 是,HTTPClient_readResponseBody收到的数据不是 以空值结尾的 字节字符串

使用时

Display_printf(display, 0, 0, "%.*s \r\n",ret,data);

您使用ret参数指定字符串的长度,因此printf格式将在指定的长度之后不打印任何内容。

当您使用纯"%s"时,printf格式将尝试通过找到终止的空字符'\0'来查找字符串的结尾。

要么使用"%.*s"保留当前方法,然后传递长度;或将sizeof(data) - 1设置为要接收的最大长度,然后在正确的位置(data[ret])处显式添加空终止符。

答案 1 :(得分:0)

按照@Some程序员的说法,我使用了另一个char数组将大小为“ len”的“ data”子字符串化。这样可以实现我想要的功能,现在它不包含任何多余的字符。

// Substring from 0 to len of data (removes extra characters)
char json[len+1];
int c = 0;
for(; c<len; c++) {
    json[c] = data[c];
}
json[c] = '\0';

Display_printf(display, 0, 0, "json received: %s\n", json);