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)