繁体   English   中英

带有结构成员char数组的sscanf

[英]sscanf with struct member char array

我在为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]    

在缩小到struct char数组的问题之前,我花了很多时间检查格式说明符。 为什么结构中的char数组不起作用? 有任何想法吗?

提前致谢。

更新从uint16_t更改为int的作品。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM