尝试在C中复制字符串的一部分时的有趣行为

时间:2019-05-17 21:46:46

标签: c arrays string pointers memcpy

我有一个名为buf的字符串,我想将前三个字符复制到一个单独的字符串中,然后再将位置4-6的字符复制到一个单独的字符串中。

buf =“ V01clsxxxxxxxxxx”

 char ID [3] = "";
 char CMD [3] = "";
 memcpy(ID, buf, 3*sizeof(char));
 memcpy(CMD, buf + 3, 3*sizeof(char));

当我输出ID时,它会按预期显示“ V01”。

当我输出CMD时,它说“ clsV01”,而我希望它说“ cls”。我是C语言的初学者,想知道我的思想错误在哪里,为什么会这样表现?

我已经通过这样做解决了这个问题

char * buff = (char*)buf;
char * ID  = malloc(3 * sizeof(char));
char * CMD = malloc(3 * sizeof(char));
memcpy(ID, buff, 3*sizeof(char));
memcpy(CMD, buff + 3, 3*sizeof(char));

但是我仍然想知道导致它的潜在机制。

最诚挚的问候

1 个答案:

答案 0 :(得分:1)

您的代码是UB。要存储3个字符字符串,您需要 4 个字符数组。

因为没有足够的空间可以终止零。所有的字符串考虑因素都没有意义,因为您的dadsa ID无效C字符串

所以尝试:

 char ID [4] = "";
 char CMD [4] = "";
 memcpy(ID, buf, 3*sizeof(char));
 memcpy(CMD, buf + 3, 3*sizeof(char));
 ID[3] = 0;
 CMD[3] = 0;


char * ID  = malloc(4);
char * CMD = malloc(4);
memcpy(ID, buff, 3);
memcpy(CMD, buff + 3, 3);

 ID[3] = 0;
 CMD[3] = 0;

sizeof(char)根据定义始终为1。