我在C中声明一个字符串时的奇怪值

时间:2010-11-15 20:50:57

标签: c string

我想声明一个包含4个字符的字符串

char st[4];
memcpy(st,"test",4);

但是当我打印出来的时候......我有“测试”和其后印有的其他符号 - 那有什么不对?

非常感谢

3 个答案:

答案 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]);

现在打印好了。但是阅读其他答案,看看你的编程不好。