尝试在 C 中复制部分字符串时的有趣行为
Interesting behaviour when trying to copy parts of a string in C
我有一个名为 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));
但我还是想知道导致它的潜在机制。
此致
您的代码是一个 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) 根据定义总是一个。
我有一个名为 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));
但我还是想知道导致它的潜在机制。
此致
您的代码是一个 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) 根据定义总是一个。