ahm*_*dkh 3 c memcpy string-literals
我有这个数组
uint8_t *buffer = "JOHN:DOE:010119:M:FOO:BAR";
Run Code Online (Sandbox Code Playgroud)
我想逐字段地将它复制到数据结构中
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;
Run Code Online (Sandbox Code Playgroud)
假设所有长度都是固定的(例如firstName,总是由4个字符,lastName3个等等组成......)
我用这种方法:
DataStructTypeDef foo;
memcpy((void *)&foo, (void *)buffer, sizeof(DataStructTypeDef));
Run Code Online (Sandbox Code Playgroud)
当我尝试打印时,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;
}
Run Code Online (Sandbox Code Playgroud)
由于char array您复制的成员不是以null结尾,printf("%s",因此不知道它何时遇到每个字符串的结尾.
这可以printf通过限制打印的字符数来控制...
例如:
printf("%.*s", (int)sizeof(foo.dateOfBirth), foo.dateOfBirth);
Run Code Online (Sandbox Code Playgroud)
相当于:
printf("%.6s", food.dateOfBirth);
Run Code Online (Sandbox Code Playgroud)
.*指定要打印的字符的"精度".所以在你的情况下,dateOfBirth= precision/size 6.
| 归档时间: |
|
| 查看次数: |
170 次 |
| 最近记录: |