strtok segmentation fault, еще один способ разбить строки?

Что ж, у меня проблемы со Стртоком. Я прочитал много сообщений, в которых говорилось, что я не могу использовать char * с strtok, но что еще я могу использовать для разделения строки (char *)? или вы знаете, как использовать strtok с указателями?

int play(char** matrixGame, char** matrixUser, int rows, int columns, char* input)
{
   char * token2;
   int x,y;
   char * inputPlay;

   inputPlay = (char*)malloc(sizeof(char)*10);

   token2 = strtok(input, " ");
   x = atoi(token2);

   token2 = strtok(NULL, " ");
   y = atoi(token2);

   token2 = strtok(NULL, " ");
   strcpy(inputPlay,token2);    
}

надеюсь, вы можете мне помочь, ребята, спасибо.


person Community    schedule 25.08.2017    source источник
comment
Согласно документу strtok, он может и вернет NULL, когда токена больше нет. быть найденным. Таким образом, ваш код должен проверять это условие.   -  person SSC    schedule 25.08.2017
comment
Что здесь inputAux в вашем коде? Это опечатка?   -  person informaton    schedule 25.08.2017
comment
@informaton ой ничего, я что-то пробовал и забыл поменять   -  person    schedule 25.08.2017
comment
@SSC, я попробую, спасибо :)   -  person    schedule 25.08.2017
comment
@BLUEPIXY да, это так. Я что-то пробовал, но у меня не получилось и я забыл это изменить, хахаха (сейчас я отредактировал код, спасибо)   -  person    schedule 25.08.2017
comment
Я бы посоветовал запустить ваш код с помощью отладчика, такого как valgrind. Это скажет вам, какой вызов является ошибочным, поскольку неясно, в какой момент возникает ошибка. Возможно, один из вызовов strtok возвращает NULL или, возможно, вызов strcpy в конце имеет слишком маленький буфер.   -  person Tony Ruth    schedule 25.08.2017
comment
@TonyRuth ну, я отлаживаю распечатки, и он попадает сюда: token2 = strtok (NULL,); y = atoi (токен2); //Здесь.   -  person    schedule 25.08.2017
comment
Вы распечатали входную строку и токены, вышедшие из токенизатора?   -  person Tony Ruth    schedule 25.08.2017
comment
@TonyRuth Я попытался распечатать printf (% s, token2), и случилось то же самое.   -  person    schedule 25.08.2017
comment
@GustavoHurtado, я бы посоветовал распечатать каждый выпущенный токен, включая первый. Я предполагаю, что первый вызов strtok использует всю строку, поэтому второй вызов получает NULL от strtok. Вы можете попробовать поставить if (token2 ==NULL) printf("Null token\n");   -  person Tony Ruth    schedule 25.08.2017
comment
Я прочитал много сообщений, в которых говорилось, что я не могу использовать char * с _2 _ - не совсем понимаю, что вы имеете в виду. strtok() принимает char *, который указывает на строку, которая должна быть токенизирована, в качестве аргумента. Однако здесь нельзя использовать указатель на строковый литерал, поскольку попытки изменить строковые литералы вызывают неопределенное поведение, а strtok() изменяет входную строку. Может быть, это то, что вы читали ....   -  person ad absurdum    schedule 25.08.2017


Ответы (2)


Этот ответ касается вопроса OP strtok segmentation fault, another way to split strings?

Также есть еще одна функция, называемая strsep, но она не стандартизирована. В зависимости от вашего использования, вы тоже можете его использовать. (Ценой портативности).

Вы можете написать свою версию strtok, отбросив то, что вам не нравится strtok.

Вы можете хорошо изучить это обсуждение в этой обсуждавшейся ранее теме. Такие проблемы, как изменение первого аргумента или отказ от работы с постоянными массивами символов, можно решить, если вы реализуете их для своих целей.

person user2736738    schedule 25.08.2017
comment
Идея в том, чтобы не использовать char [], это моя проблема. Но все равно спасибо - person ; 25.08.2017
comment
@GustavoHurtado: Ах, я могу изменить ответ, если хотите. ИЛИ вы это решили? - person user2736738; 25.08.2017

Я обнаружил, что происходит. Раньше я использовал input в другой функции, которая тоже использует strtok, и я подумал, что input был некоторой строкой, например 2 2 x, но strtok изменил мой ввод, и это было просто 2, а не полная строка. Итак, не используйте одну и ту же переменную. Большое спасибо, ребята.

person Community    schedule 25.08.2017