具有结构成员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]
我花了很多时间检查格式说明符,然后缩小到结构字符数组的问题。为什么结构中的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覆盖。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '