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++ - 取消引用指针 -vs- &-operator

与 memcpy 连接

使用 memcpy 复制数据

c - 如果 free() 知道我的数组的长度,为什么我不能在我自己的代码中要求它?

c - 如何使用 mingw/autotools 在 Windows 上启用大文件支持?

c - 如何更改此队列顺序?

c - 从C中的字符串中删除字符

c - 有什么方法可以使用 memcpy() 将值复制到特定的字符串位置?

c - 击败 _intel_fast_memcpy 的矢量化 memcpy?

c - 为什么在以下程序中五次遇到打印语句?