c - 存储在有一些空格的数组中

标签 c memcpy

我在使用 memcpy() 时遇到问题。

我有一个 36 字节的数组。前20位填手机号码,后16位填凭证号。如果手机号码小于 20 那么它应该用空格填充。但是当我填写凭证编号时,它会覆盖第一个值。下面是我的代码。

char tempMobileNo[20],tempVoucherNo[16],o2RecordData[50];
memset(tempMobileNo,' ',20);
memset(tempVoucherNo,' ',16);
memset(o2RecordData,' ',RECORD_DATA_L);         
memcpy(tempMobileNo,ValueB,20);       
memcpy(tempVoucherNo,ValueC,16);        
memcpy(&o2RecordData[0],tempMobileNo,20);
memcpy(&o2RecordData[22],tempVoucherNo,16);

最佳答案

问题

memcpy 以这样的方式实现,您将总是复制指定字节数,它不知道“内容"缓冲区的提前结束以及它是否应因此停止复制,也不关心。

由于您首先用空格填充缓冲区,然后无条件地将指定的长度复制到 (A) 和 (B 中的缓冲区),您的空格将分别被 ValuebValueC 中可用的 20 字节和 16 字节“覆盖”。

 memcpy(tempMobileNo,  ValueB, 20); // (A)      
 memcpy(tempVoucherNo, ValueC, 16); // (B)

想法

如果您正在处理 c 风格的字符串(即以 null 结尾的字符串),请考虑使用 strncpy 而不是 memcpy.

strncpy (dst, src, n) 将最多复制 n 个字符,除非它命中src 的结尾(空字节)。

关于c - 存储在有一些空格的数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24200008/

相关文章:

c - memcpy 别名 int 到 char 产生 UB?

c - memcpy 问题将负值从 int8_t 转换为 int16_t

c - 如何防止 memcpy 缓冲区溢出?

c++ - 我怎样才能将原始数组的 memcpy 等效于 std::vector?

c - 优化给定总和的数组中对的索引

C - 为什么我的 int 值非常大?

c - 使用 X 宏扩展时强制字符串和指针进入闪存

c - union 在 Linux 进程描述符中的用法

c++ - 以老式(和肮脏的)方式填充 vector<char>

c - 声明中使用的 * 运算符 (int *p = &i) 和表达式 (*p = &i) 之间有什么区别