Интересное поведение при попытке скопировать части строки в C - PullRequest
0 голосов
/ 18 мая 2019

У меня есть строка с именем 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));

Но я все равно хотел бызнать основной механизм, который его вызывает.

С уважением

1 Ответ

1 голос
/ 18 мая 2019

Ваш код UB. Чтобы хранить 3 строки символов, вам нужно 4 массивов символов.

Потому что у вас нет места для конечного нуля. Все строковые соображения не имеют никакого смысла, так как ваш идентификатор датса недопустим. C string

так что попробуйте:

 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) по определению всегда один.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...