我需要在C中执行grep的自己的实现。我正在使用getline()从文件中读取(这是用户指定的,如果不是,则从stdin中读取)。
char* line = NULL;
size_t size = 0;
int q = 101; //Prime number for Rabin-Karp Algorithm
bool coincidence;
list_t* list = list_create();
while((getline(&line, &size, file)) > 0 && list) {
list_insert_end(list, line);
if (list_length(list) > n + 1) list_erase_first(list);
coincidence = search(string, line, q);
if (coincidence){
while (!list_is_empty(list)) printf("%s", (char*) list_erase_first(list));
}
}
free(line);
这就是我现在的代码。我创建了一个char *行,它将由getline()接收的字符串替换。然后,我尝试将其副本存储在列表(或队列)中,但是,每当我再次使用getline时,我制作的所有副本将被替换。在找到巧合之前,我需要保存前n行的副本,当我这样做时,必须打印它们。我考虑过使用strdup,但结果会相同。我曾考虑使用数组,但由于无法将所有行存储在内存中,因此无法提出正确的实现,因此当我碰巧碰到n + 1条读取行时,必须擦除并替换第一个一个被存储。队列或列表将使其变得如此简单,但是我无法正确保存getline的副本。
一旦将line
存储到列表中(就像列表中存储指针值一样,只需设置line = NULL;
,以便下次单击getline()
时将分配新的一行。