Как я могу изменить этот код для работы без функции strstr? - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь найти каждую строку, у которой есть конкретный текст, и сосчитать их без использования strstr или getline.как я могу изменить свой код для работы без него?

#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char * argv[]){

FILE * fp;
char * s = argv[1];
int lines = 0, i;
fp = fopen("mytext.txt", "r");
if(fp == NULL){
    printf("error\n %d", fp);
    exit(1);
}
size_t lookfor;
char * lines = NULL;
size_t len = 0;
while ((lookfor = getline(&lines, &len, fp)) != -1) {
    if(strstr(lines, s) != NULL) {
        lines+= 1;
    }
}
fclose(fp);
printf("the number of lines that include the word 'great' are%d\n", lines);
return 0;
}

1 Ответ

0 голосов
/ 01 февраля 2019

Поскольку вы включаете <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; это может быть не так.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...