strtok вызывает ошибку сегментации - PullRequest
0 голосов
/ 23 декабря 2018

Я должен получить третье слово в строке и хотел использовать strtok .Теперь первый printf работает, но после этого я получаю ошибку сегмента.Так что tokenizedString = strtok(NULL, " "); должно быть причиной проблемы, верно?

Просто для контекста: я ищу третье слово в строке, и между словами может быть как можно больше пробелов.

#include <string.h>
#include <stdio.h>

char *tokenizeString(char *userCommand)
{
  char *tokenizedString;
  int counterForToken;
  tokenizedString = strtok(userCommand, " ");
  for(counterForToken = 0; counterForToken != 3; counterForToken++)
  {
    printf("%s\n", tokenizedString);
    tokenizedString = strtok(NULL, " ");
    if(tokenizedString == NULL)
    {
        break;
    }
  }
  printf("%s\n", tokenizedString);
  return tokenizedString; 
}

int main(void)
{
  char userCommand[255] = {0};
  fgets(userCommand, sizeof(userCommand), stdin);
  tokenizeString(userCommand);
}

1 Ответ

0 голосов
/ 23 декабря 2018

Теперь первый printf работает, но после этого я получаю Seg Fault.Так что tokenizedString = strtok(NULL, " "); должно быть причиной проблемы, верно?

Нет, это очень плохая корреляция.Проблема на самом деле во втором вызове printf.Вы можете передать его tokenizedString, когда tokenizedString == NULL.Указанный формат %s указан для ожидания действительного указателя на первый символ массива символов с нулевым символом в конце.Передача NULL недопустима и ведет к неопределенному поведению (например, к аварийному завершению).Исправить это просто: проверить нулевое значение указателя.И то же самое относится к первой итерации цикла, конечно

char *tokenizeString(char *userCommand)
{
  char *tokenizedString;
  int counterForToken;
  tokenizedString = strtok(userCommand, " ");
  for(counterForToken = 0; counterForToken != 3 && tokenizedString != NULL; counterForToken++)
  {
    printf("%s\n", tokenizedString);
    tokenizedString = strtok(NULL, " ");
  }
  if(tokenizedString != NULL)
    printf("%s\n", tokenizedString);
  return tokenizedString; 
}
...