Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:将getline()创建的字符串存储在链接列表中?_C_String_Linked List_Grep_Getline - Fatal编程技术网

C:将getline()创建的字符串存储在链接列表中?

C:将getline()创建的字符串存储在链接列表中?,c,string,linked-list,grep,getline,C,String,Linked List,Grep,Getline,我需要在C中自己实现grep。我使用getline()读取文件(这是由用户指定的,如果不是,则从stdin读取) 这就是我现在掌握的密码。我创建了一个char*行,它将被getline()接收的字符串替换。然后我尝试将它的一个副本存储在列表(或队列)中,但是,每当我再次使用getline时,我制作的所有副本都将被替换。 我需要先保存前n行的副本,然后才能找到一致性,当我这样做时,我必须打印它们。我曾想过使用strdup,但结果会一样。 我曾想过使用数组,但我无法想出正确的实现,因为我无法在内存中

我需要在C中自己实现grep。我使用getline()读取文件(这是由用户指定的,如果不是,则从stdin读取)

这就是我现在掌握的密码。我创建了一个char*行,它将被getline()接收的字符串替换。然后我尝试将它的一个副本存储在列表(或队列)中,但是,每当我再次使用getline时,我制作的所有副本都将被替换。 我需要先保存前n行的副本,然后才能找到一致性,当我这样做时,我必须打印它们。我曾想过使用strdup,但结果会一样。
我曾想过使用数组,但我无法想出正确的实现,因为我无法在内存中存储所有的行,因此当我达到n+1个读取行时,我必须擦除并替换存储的第一个。队列或列表将使它变得更容易,但我无法正确保存getline的副本。

一旦将
line
存储到列表中(如列表中存储指针值),只需设置
line=NULL以便下次点击
getline()
时将分配新行。

一旦将
line
存储到列表中(如列表中存储指针值),只需设置
line=NULL
以便下次点击
getline()
时,将分配一个新行

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);