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

尝试在C中复制字符串部分时的有趣行为,c,arrays,string,pointers,memcpy,C,Arrays,String,Pointers,Memcpy,我有一个名为buf的字符串,我想将前3个字符复制到一个单独的字符串中,然后将位置4-6上的字符也复制到一个单独的字符串中 buf=“v01clsxxxxxxxxx” 当我输出ID时,它会按预期显示“V01” 当我输出CMD时,它会显示“clsV01”,而我希望它会显示“cls”。我是C语言的初学者,不知道我的思维错误在哪里,为什么会这样 通过这样做,我已经解决了这个问题 char * buff = (char*)buf; char * ID = malloc(3 * sizeof(char))

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

buf=“v01clsxxxxxxxxx”

当我输出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));
但我仍然想知道导致它的潜在机制


向您致意

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

因为你没有足够的空间放零。由于您的datsa 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)根据定义总是一个。

您没有显示如何“输出”缓冲区。但可能您将它们传递给了一个需要以null结尾的字符串的函数,而缓冲区则不是。如果您想要一个3字符的字符串,则必须为4个元素留出空间。在C语言中,字符串有一个NUL终止符。如果不提供NUL终止符,则数组不是字符串,并且不能与大多数字符串处理库函数一起使用。我通过串行控制台输出缓冲区。我正在为arduino编程。我开始增加字符数组的大小,并根据我的高度得到不同的工件。在[4]中,当我转到[8]时,CMD的输出是“clsHV01”,CMD是“cls”,但突然ID变成了“V01H”。。。我很困惑。
sizeof(char)
只是拼写
1
的一种冗长的方法。如果您合理地期望将来计划将代码更改为
wchar\u t
,那么这些
sizeof(char)
表达式可以用作有用的占位符,否则就不行了。这很有效!感谢您的澄清,这是另一个教训。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;