fgets, ошибка сегмента и массив строк

У меня проблемы с тем, чтобы эта короткая программа работала. Это не завершено, но я хочу устранить ошибку сегмента, которую я получаю при компиляции. Суть того, что там есть:

Чтобы прочитать (под) строку в командной строке и найти эту (под) строку в каждом "слове" в stdin. Каждое слово, которое содержит эту (под) строку печатается. Если совпадение не найдено, выводится соответствующее сообщение. Кроме того, если есть меньше или больше чем один аргумент командной строки, выводится сообщение об использовании.

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

Результат, когда я ввожу: ./match ant < match.data в командной строке, с match.data держа

fantastic dog x gooblygooblygoo antx xant ant anananananananananananan

Когда fgets достигает конца match.data, он не возвращает NULL и цикл завершается?

Спасибо!

1 ответ

Решение

Есть две проблемы с вашим кодом:

  1. Вы используете неинициализированный указатель в fgets вызов (все указатели в массиве неинициализированы)

  2. Ты делаешь sizeof в указателе, который возвращает размер указателя, а не то, на что он указывает.

Для решения первой проблемы необходимо выделить память для указателей внутри массива. Это может быть сделано путем динамического распределения (например, malloc) или сделать его массивом массивов.

Когда первая точка решена, вторую точку легко решить, так как тогда у вас есть размер строк.


Читая ваш код ближе, вы фактически инициализируете первый указатель в массиве, когда указываете на постоянный (только для чтения) массив из пяти символов, символьный литерал "NOPE", Помимо неопределенного поведения при использовании неинициализированных данных, у вас есть еще один случай, когда вы пытаетесь записать в постоянную память (и, возможно, записать за пределы, если первый ввод более четырех символов).

Другие вопросы по тегам