Поскольку вы включаете <stdio.h>
, вы неявно позволяете себе использовать стандартные функции ввода-вывода (Если даже это запрещено, как будет происходить ввод или вывод в вашей программе?).
Обязательно ознакомьтесь с некоторыми C ссылками о функциях C стандартной библиотеки . Прочитайте документацию по каждой функции, которую вы используете .Позже, проверьте также стандарт C11 n1570 .
В Linux getline
является объявленным в <stdio.h>
, но не является стандартной функцией ввода-вывода.Это в POSIX.Это описано в справочной странице getline(3)
(полученной с помощью команды man getline
).
Таким образом, вы можете и, вероятно, должны использовать такие функции, как fopen
и fgets
и fgetc
.В Linux см. Также их справочную страницу, например, fgets(3)
, которая напоминает вам, что она стандартизирована в C99.
Простым подходом было бы объявить некоторый буфер для вашей строки, например
char mylinebuf[128];
до документа , что вы принимаете только строки, меньшие 128 байт, и используете
char* res = fgets(mylinebuf, sizeof(mylinebuf), fp);
Не забудьте проверить на сбой стандартного ввода-выводафункции.В частности, fopen
может завершиться с ошибкой и fgets
также может завершиться с ошибкой.
Более умный подход может имитировать то, что делает getline
(поэтому, возможно, напишите свою собственную mygetline
функцию), используя только fgetc(3)
.
Если вам запрещено использовать strstr
, вы можете написать свою собственную функцию mystrstr
, делая то же самое (возможно, используя strchr
, если вам разрешено это использовать, в противном случае вы все сами программируете).Это базовый указатель.
Запись вашего mystrstr
выше strchr
оставлена читателю в качестве упражнения.А также написание вашего mystrchr
с использованием основных операций с указателями.
Если вы используете GCC в Linux, всегда включайте все предупреждения и отладочную информацию, поэтому скомпилируйте с помощью gcc -Wall -Wextra -g
.
Читайте также Как отлаживать небольшие программы .Так что в Linux научитесь использовать gdb
отладчик и valgrind .Избегайте неопределенного поведения -UB- (и у вашей программы их несколько, например, при вызове без дополнительных аргументов).Например,
printf("error\n %d", fp);
неверно и UB (и компилятор предупредил бы вас с помощью gcc -Wall -Wextra -g
).
Вам нужно улучшить код, чтобы избежать UB, и это гораздо большечем просто изменить его, чтобы избежать strstr
.
Кстати, в 2019 году UTF-8 используется повсеместно (на практике), и это может усложнить вашу программу, если вы хотитебыть серьезным (вы можете использовать libunistring , если вам позволено, или написать свой mystrstr
, чтобы узнать о UTF-8 , и проверить, что содержимое вашего входного файла -или аргументы вашей программы - допустимые UTF-8; это может быть не так.).