Помните: fgetc (), getc (), getchar () все возвращают целое число, а не символ. Целое число может быть EOF или допустимым символом, но оно возвращает еще одно значение, чем диапазон, поддерживаемый типом символа.
Вы пишете суррогат для команды 'fgrep':
fgrep -f strings.txt text_file.txt > out.txt
Вместо чтения символов вам нужно будет читать строки - используя fgets (). (Забудьте, что функция gets () существует!)
Я отступил в вашем коде и вставил возврат 0; в конце для вас (хотя C99 делает неявное 'return 0;', если вы опускаетесь до конца main ()). Однако C99 также требует явного возвращаемого типа для каждой функции - и я добавил для вас int к int main () (но вы не можете использовать оправдание, совместимое с C99, чтобы не возвращать 0 в конце). Сообщения об ошибках должны записываться в стандартную ошибку, а не в стандартный вывод.
Возможно, вам потребуется использовать динамическое размещение для списка строк. При простом поиске будет просто применяться strstr () для поиска каждой из требуемых строк в каждой строке ввода (убедитесь, что цикл разорван, как только вы нашли совпадение, чтобы строка не повторялась при наличии нескольких совпадений на одной строке).
Более сложный поиск позволил бы заранее рассчитать, какие символы можно игнорировать, чтобы вы могли искать все строки параллельно, пропуская текст быстрее, чем цикл в цикле. Это может быть модификация алгоритма поиска, такого как Бойер-Мур или Кнут-Моррис-Пратт ( добавлено : или Рабин-Карп, который предназначен для параллельного поиска нескольких строк).