C 存储在带有一些空格的数组中

C 存储在带有一些空格的数组中,c,memcpy,C,Memcpy,我在使用memcpy()时遇到问题 我有一个36字节的数组。前20个应填写手机号码,其余16个应填写凭证号码。如果手机号码小于20,则应使用空格填充。但当我填写凭证编号时,它会覆盖第一个值。下面是我的代码 char tempMobileNo[20],tempVoucherNo[16],o2RecordData[50]; memset(tempMobileNo,' ',20); memset(tempVoucherNo,' ',16); memset(o2RecordData,' ',RECORD

我在使用
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(&o2RecordData[20],tempVoucherNo,16);
问题
memcpy
的实现方式是,您将始终复制指定字节数,它不知道缓冲区的“内容”是否提前结束以及是否应因此停止复制,也不关心

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


思想 如果您正在处理C样式字符串(即空终止字符串),请考虑使用<强>代码> STRNCPY < /代码> <强>,而不是<强> > MeMCPY < /Cord>>/P>
strncpy(dst,src,n)
将最多复制
n
个字符,除非它到达
src
的末尾(一个空字节)。

memcpy(&o2RecordData[22],tempoucheno,22);这将在第22个索引处添加。在第23个索引处添加。但是你想从第21个索引1开始:这不是代码的直接问题,请参阅我的帖子了解原因。你的最后一行代码有些可疑。您之前已将tempVoucheno定义为16个字符的数组。现在您正在从中复制22个字节…我发现可疑的是您正在填充空格。。。但是您没有使用字符串结尾标记(
'\0'
)。。。当您完全复制
ValueB
ValueC
时,可能不需要。您能提供您看到凭证覆盖手机号码的代码吗?。您能提供o2RecordData、ValueB和ValueC的定义吗?如果我的ValueB不是20个字节,我想添加空格,我确实使用了strcpy,但结果是相同的:(@MuneebZulfiqar请注意,
strcpy
会将空字节从src复制到dst,这将有效地提前结束tempVoucheno和tempMobileNo。复制后需要将空字节替换为空格,并确保在将两个数组用作c样式字符串之前以空终止它们。
memcpy(&o2RecordData[20],tempVoucherNo,16);
 memcpy(tempMobileNo,  ValueB, 20); // (A)      
 memcpy(tempVoucherNo, ValueC, 16); // (B)