我有这个数组
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,sizeof(DataStructTypeDef)); printf("%s",foo.dateOfBirth); // It prints 010119:M:FOO:BAR //printf("%s",foo.dateOfBirth); // Expected value 010119 return 0; }
解决方法
由于您复制的char数组成员不是以null结尾,因此printf(“%s”)在遇到每个字符串的结尾时都不知道.
这可以通过限制打印的字符数量来控制printf …
例如:
printf("%.*s",(int)sizeof(foo.dateOfBirth),foo.dateOfBirth);
相当于:
printf("%.6s",food.dateOfBirth);
.*指定要打印的字符的“精度”.所以在你的情况下,dateOfBirth = precision / size 6.