我在memcpy中遇到以下错误。它没有给出编译错误,但没有给出我想象的结果。我之前从未使用过memcpy所以我确定我犯了一个简单的错误。我已经查看过以前的问题,但找不到结构问题。我可以在独立变量上使用memcpy,但不能在结构上使用。
如果有人可以指出我的错误那就太棒了。
#include <stdio.h>
#include <string.h>
int main() {
struct st{
char c1[12];
char c2[32];
char c3[3];
char c4[7];
char c5[13];
char c6[5];
char c7[10];
};
struct st s;
char s1[] = "part number";
char s2[] = "j9uijd9d09fj";
char s3[] = "abc";
char s4[] = "seven";
char s5[] = "aaaaaaaa";
char s6[] = "ptype";
char s7[] = "user";
memcpy(s.c1,s1,sizeof(s.c1));
memcpy(s.c2,s2,sizeof(s.c2));
memcpy(s.c3,s3,sizeof(s.c3));
memcpy(s.c4,s4,sizeof(s.c4));
memcpy(s.c5,s5,sizeof(s.c5));
memcpy(s.c6,s6,sizeof(s.c6));
memcpy(s.c7,s7,sizeof(s.c7));
printf("%s\n",s.c1);
printf("%s\n",s.c2);
printf("%s\n",s.c3);
printf("%s\n",s.c4);
printf("%s\n",s.c5);
printf("%s\n",s.c6);
printf("%s\n",s.c7);
return 0;
}
OUTPUT我收到了:
part number
j9uijd9d09fj
abcseven
seven
aaaaaaaa
ptypeuser
user
感谢!!!
答案 0 :(得分:3)
将结构中c3
的大小更改为4
,将c6
更改为6
以允许NULL
终结符。
struct st{
char c1[12];
char c2[32];
char c3[4]; /* putting 'abc' which is 4 chars */
char c4[7];
char c5[13];
char c6[6]; /* putting 'ptype' which is 6 chars */
char c7[10];
};
答案 1 :(得分:1)
printf
的 %s
打印以空字符结尾的字符串。 s3
(和s6
)在这种情况下由c
覆盖了空终止字符,因此printf
在到达下一个seven
时会停止打印它。 1}}。
答案 2 :(得分:1)
你的代码有两件事是错误的:
s.c3
长度为3个字符,因此没有额外NUL字节的空间。这就是为什么你在打印时将它与下一个连接起来的原因。memcpy(s.c2,s2,sizeof(s.c2))
正在复制32个字节,但原始字符串要短得多。这是未定义的行为。您想使用strcpy()
的Probabl。
甚至strncpy
,但要注意!这个功能并不能满足大多数人的想法......在使用之前至少阅读两次文档。
答案 3 :(得分:0)
在结构中,成员c3
是一个包含三个字符的数组。然后将四个字符复制到其中!请记住,字符串有一个额外的字符结束字符串,因此字符串"abc"
实际上是四个字符:'a'
,'b'
,'c'
和终止符'\0'
结构的c6
成员也一样。
答案 4 :(得分:0)
您面临的问题是缺少字符序列的NUL终止符。
构造函数的字符序列总是比你键入的字符数长一个字符。最后的附加字符是NUL终结符。
因此,复制内容的数组需要比要复制的字符数长一个字符。对于c3
,字符数太小,导致NUL终止符为丢失。
printf
然后按字符打印字符串,直到它看到NUL终结符。如果它丢失,printf
只是继续读取内存,直到它到达第一个0x00
字节。在这种情况下,你很幸运,因为你正在使用一个结构。结构写在一个内存块中,因此printf
只会进入下一个字段。
只需确保结构中的数组大小始终大于要复制的字符序列,即可解决问题。