在下面的代码中,当用以下命令打印“数据”时:
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);
答案 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);