Есть много вещей, которые могут быть не правы в вашем неполном коде, но одной очевидной проблемой является цикл:
for (int i = 3; i <= tokenCounter; i++){
name = strtok(NULL, " ");
if (tokenCounter > 3)
strcat(name, strtok(NULL, " "));
}
При первом прохождении цикла name
назначит указатель на сканированиебуфер, который не будет работать, если name
равен char name[MAX];
(что необходимо для того, чтобы любой ваш код имел какие-либо надежды на работу), поэтому вы должны увидеть ошибку компиляции. Затем, strtok
возвращает NULL
, когда он достигает конца ввода, что, вероятно, вызовет немедленный сбой, когда вы передадите его в strcat
. Вам нужно что-то более похожее на
name = strcpy(strtok(NULL, " "));
while (char *tmp = strtok(NULL, " ")) {
strcat(name, " ");
strcat(name, tmp);;
}
Не то, чтобы это было все так хорошо, так как оно не проверяет переполнение буфера, а просто разбивает токены повторной сборки, так зачем беспокоиться? Просто используйте strtok(NULL, "\n");
, чтобы получить весь остаток строки в виде одного "токена".
Если вы ошибочно объявили char *name;
, это, вероятно, объясняет ваш сбой. Когда вы делаете
name = strtok(NULL, " ");
if (tokenCounter > 3){
for (char *p = strtok(NULL," "); p != NULL; p = strtok(NULL, " ")){
strcat(name, p);
В первой строке name
указывается на буфер strtok, а затем в цикле вы пытаетесь добавить часть буфера к себе, что вызывает неопределенное поведение.