strchr вызывает ошибку сегментации в C

У меня проблема с программой на Си. я знаю это strchr() вызывает проблему, и она возвращается

Ошибка сегментации

Мой код выглядит следующим образом:

char *pointer;
pointer = strchr(string, character);

Я не знаю, почему я получаю сообщение об ошибке. Я могу догадаться, что моя "строка" иногда не содержит символа. Может ли это быть причиной, почему?

Как я могу остановить это, так как у меня нет контроля над входной строкой?

Полный код

int index(const char *string, char character)
{
    const char *pointer;
    pointer = strchr(string, character);

    if(pointer)
        return (pointer - string);
    else
        return -1;
}

3 ответа

Для написания кода сохранения всегда выполняйте проверку ввода:

Либо трудный путь (если NULL не должен быть передан в):

ssize_t index(const char * string, const char character)
{
  assert(NULL != string);

  const char * pointer = strchr(string, character);

  if (pointer)
  {
    return (pointer - string);
  }
  else
  {
    return -1;
  }
} 

Или плавным способом (молча лечить NULL Также как ""):

ssize_t index(const char * string, const char character)
{
  const char * pointer = NULL;

  if (string)
  {
    pointer = strchr(string, character);
  }

  if (pointer)
  {
    return (pointer - string);
  }
  else
  {
    return -1;
  }
}

Сначала попробуйте распечатать ввод для вашего метода.

Отсюда

Функция strchr ищет строку для первого вхождения c. Строка с нулевым символом завершает поиск.

Вы уверены, что ваша строка законна? (имеется в виду ноль)

Я думаю, что это может привести к вашей проблеме

Функция strchr(char *string, int c) возвращает указатель на первое вхождение символа c в строке или указатель NULL, если соответствующий символ не найден.

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

Если вы хотите напечатать строку или выполнить другие операции с результатом, сначала проверьте указатель; в вашем конкретном случае:

if(pointer != NULL)
   printf(...);
   [...]
Другие вопросы по тегам