【问题标题】:Why does json data contain extra characters为什么json数据包含多余的字符
【发布时间】:2019-05-23 07:03:52
【问题描述】:

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

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”的等价代码是什么,让data可以存储正确的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);

【问题讨论】:

标签: c


【解决方案1】:

我的猜测是您通过HTTPClient_readResponseBody 收到的数据不是空终止字节串。

当你使用

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

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

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

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

【讨论】:

  • 感谢您的帮助
【解决方案2】:

正如@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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 2018-06-19
    • 2013-05-24
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    相关资源
    最近更新 更多