具有结构成员char数组的sscanf

sscanf with struct member char array

本文关键字:数组 sscanf char 成员 结构      更新时间:2023-10-16

我在为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数组不起作用?有什么想法吗?

提前谢谢。

更新从uint16_t更改为int有效。

您使用了错误的格式说明符来读取item.count。对于uint16_t,必须使用"%"SCNd16"%"SCNu16而不是"%d"

由于大多数现代平台上的int都是32位长,写入item.count的数据会溢出到item.ID中。在小端序体系结构中,如果值适合uint16_t,溢出的字节将为零,从而有效地将缓冲区中的字符串终止在位置0。

您可以尝试在源字符串中为item.count提供负值,并看到item.ID的前两个字节被0xFF覆盖。