【发布时间】:2019-01-22 14:16:25
【问题描述】:
我有这个数组
uint8_t *buffer = "JOHN:DOE:010119:M:FOO:BAR";
我想将它逐个字段复制到数据结构中
typedef struct{
uint8_t firstName[5];
uint8_t pad1;
uint8_t lastName[4];
uint8_t pad2;
uint8_t dateOfBirth[7];
uint8_t pad3;
uint8_t genre;
uint8_t pad4;
uint8_t car[4];
uint8_t pad5;
uint8_t phone[4];
uint8_t pad6;
}DataStructTypeDef;
假设所有长度都是固定的(例如,firstName 始终由 4 个字符组成,lastName 由 3 个字符组成,等等......)
我使用了这种方法:
DataStructTypeDef foo;
memcpy((void *)&foo, (void *)buffer, sizeof(DataStructTypeDef));
当我尝试打印 dateOfBirth 时,它会像这样显示从 01012019 开始的整个数组
int main(void)
{
DataStructTypeDef foo;
memcpy((void *)&foo, (void *)buffer, sizeof(DataStructTypeDef));
printf("%s", foo.dateOfBirth); // It prints 010119:M:FOO:BAR
//printf("%s", foo.dateOfBirth); // Expected value 010119
return 0;
}
【问题讨论】:
-
警告:“firstName 总是由 4 个字符组成,lastName 是 3 个等等......”是假的,你错过了以空字符结尾的地方
-
@zerocoldTUN 如果你不以空字符结束字符串,你将无法使用假设存在的标准函数,所以没有 printf / strcpy / strdup/ .... @ 987654328@ 表示 lastName 包含 1 或 2 个字符,然后是 \0,而不是 3 个字符
-
您的问题是什么?你知道 C 是如何模仿“字符串”的吗,实际上它不是 C 中的数据类型。你可能想了解
0-terminatedchar-arrays 的概念。 -
"using a padding bit" 你所说的“bit”实际上是
byte,或者更准确地说是@ 987654332@. -
注意:此代码在 C 语言中不需要强制转换,建议使用 sizeof 对象。简化:
memcpy(&foo, buffer, sizeof foo);易于正确编码、审查和维护。
标签: c memcpy string-literals