我想声明一个包含4个字符的字符串
char st[4];
memcpy(st,"test",4);
但是当我打印出来的时候......我有“测试”和其后印有的其他符号 - 那有什么不对?
非常感谢
答案 0 :(得分:11)
C字符串,如"test"
字符串文字,是NUL终止的,这意味着最后一个字符是'\ 0':
{'t', 'e', 's', 't', '\0'}
您需要使用st[5]
,并复制5个字符,以便有空间(并包含)NUL。原样,你没有把它包含在副本中。所以,st
看起来像是:
{'t', 'e', 's', 't', X, X, X ... '\0'}
当你打印时,C会不断读取内存中的乱码值(上面的X')直到找到NUL。
最好的解决方案是消除memcpy
,让编译器从初始化中找出大小:
char st[] = "test";
sizeof(st)
现在为5。
答案 1 :(得分:2)
如果你真的想使用memcpy()
,你还必须复制终止空字节:
char st[5];
memcpy(st, "test", 5);
请记住,在内存中"test"
看起来像这样:
74 65 73 74 00
t e s t \0
这就是你必须复制5个字节的原因。
如果不复制空字节,那么对空终止字符串起作用的函数(例如printf()
)将读取内存,直到它们到达某个随机空字节...
答案 2 :(得分:2)
如果由于一些奇怪的原因想要保持您的代码不变,请执行以下操作:
char st[4];
memcpy(st,"test",4);
int i;
for(i = 0; i < 4; i++)
printf("%c",st[i]);
现在打印好了。但是阅读其他答案,看看你的编程不好。