加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

将uint8_t数组复制到结构

发布时间:2020-12-14 05:45:52 所属栏目:Windows 来源:网络整理
导读:我有这个数组 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_
我有这个数组

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读