在为Arduino编写代码时,我发现了这种意外行为,并且能够在MSVC15中复制相同的内容:
struct IDCount
{
uint16_t count;
char ID[20];
};
void test06b()
{
IDCount item;
char str[] = "0411010103, 8";
char str1[20];
// writing to struct member char array
int res1 = sscanf(str, "%[^,], %d", item.ID, &item.count);
printf("[%d] id: [%s]\tcount: [%d]\n", res1, item.ID, &item.count);
// writing to a char array
int res2 = sscanf(str, "%[^,], %d", str1, &item.count);
printf("[%d] id: [%s]\tcount: [%d]\n", res2, str1, &item.count);
}
结果:
[2] id: [] count: [8]
[2] id: [0411010103] count: [8]
在缩小结构char数组的问题之前,我花了很多时间检查格式说明符。为什么结构中的 char数组不起作用?有什么想法吗?
谢谢。
更新 从uint16_t更改为int即可。
答案 0 :(得分:0)
您使用了错误的格式说明符来读取item.count
。对于uint16_t
,您必须使用"%"SCNd16
或"%"SCNu16
而不是"%d"
。
在大多数现代平台上,int
的长度为32位,因此写入item.count
的数据会溢出到item.ID
中。在小端的体系结构上,其值适合uint16_t
,溢出的字节将为零,从而有效地将缓冲区中的字符串终止于位置0。
您可以尝试在源字符串中为item.count
提供一个负值,并看到item.ID
的前两个字节被0xFF覆盖。