Как можно через 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