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

标签 c arrays string pointers memcpy

我有一个名为 buf 的字符串,我想将前 3 个字符复制到一个单独的字符串中,然后将位置 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));

但我仍然想知道导致它的根 native 制。

致以诚挚的问候

最佳答案

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

因为你没有空间容纳终止零。所有字符串考虑因素都没有任何意义,因为您的数据 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) 根据定义始终为一。

关于c - 尝试在 C 中复制字符串的一部分时的有趣行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56193961/

相关文章:

c - 如何在 C 中将 union 值写入数组元素?

c - 导致 C 崩溃的数组大小

javascript - JavaScript 数组中的字符串

java - 如何将 JDateChooser 格式化为 dd-mm-yyyy?

c - PThreads:内核与线程

c - Erlang NIF : Threads locking

条件变量的误解

使用 fclose() 后损坏的双链表;

java - 使用 ArrayList <Integer> 对整数进行排序

c - 从文件中以不同的字符串读取 2 个巨大的数字