Как можно через stdin в аргументах использовать больше слов, требуемых для поиска?

Вот код, он ищет в текстовом файле тот ряд, в котором есть слово, написанное еще в командной строке. Вызывается так ./a.out pattern filename, где pattern это слово которое нужно найти и filename - название файла.

#include <stdio.h>
#include <stdlib.h>

#ifndef SIZE
#define SIZE 10
#endif

enum { NO_ERROR = 0,
        NO_PATTERN = 1
};

unsigned long get_str_len(const char *str);
int str_match(const char *pattern, const char *str);
char *readLine(FILE *fid);

int main(int argc, char *argv[])
{
    int ret = NO_ERROR;

    if (argc <= 3){
        const char *pattern = argc > 1 ? argv[1] : NULL;
        const char *fname = argc > 2 ? argv[2] : NULL;
        FILE *fid = fopen(fname, "r");
        int err = 0;
        char *line = readLine(fid);
        while (line!=NULL){
            int m = str_match(pattern, line);
            if (m>=0){
                printf("%s\n", line);
                err+=1;
            }
            free(line);
            line = readLine(fid);
        }
        if (err == 0)
            ret = NO_PATTERN;
        fclose(fid);

    }
        return ret;
}


char *readLine(FILE *fid)
{//reads every line in file
    int capacity = SIZE;
    char *ret = malloc(capacity + 1);
    int len = 0;
    int r;
    if (!ret){
        exit(-1);
    }
    while ((r = getc(fid)) && r != EOF && r != '\n'){
        if (len == capacity){
            char *tmp = realloc(ret, capacity + SIZE + 1);
            if (tmp == NULL){
                free(ret);
                exit(-1);
            }
            ret = tmp;
            capacity += SIZE;
        }
        ret[len++] = r;
    }
    if (r == EOF && len == 0){
        free(ret);
        ret = NULL;
    }
    else
        ret[len] = '\0';
    return ret;
}

unsigned long get_str_len(const char *str)
{//gets lenth of the put string
    unsigned long ret = 0;
    while (str && *(str++) != '\0')
        ret+=1;
    return ret;
}

int str_match(const char *pattern, const char *str)
{//
    int ret = -1;
    if (pattern && str){
        int i1 = 0;
        int i2 = 0;
        int s = 0;
        while (pattern[i1] != '\0' && str[i2] != '\0'){
            if (str[i2] != pattern[i1])
                i1 = 0;
            if (str[i2] == pattern[i1]){
                if (i1 == 0)
                    s = i2;
                i1+=1;
            }
            i2+=1;
        }
        if (pattern[i1] == '\0')
            ret = s;
        }
    return ret;
}
  

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

Вот пример как работает код

то что хранится в файле

Greenfileside name
freelong long side 
frFreesidess
siless men text
read that side of text for decoding

через ./a.out side filename компилируем

вывод

Greenfileside name
freelong long side
frFreesidess
read that side of text for decoding

Ответы (0 шт):