首页 > 解决方案 > C:将 getline() 创建的字符串存储在链接列表中?

问题描述

我需要在 C 中自己实现 grep。我正在使用 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);

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

标签: cstringlinked-listgrepgetline

解决方案


一旦你已经存储line到列表中(因为在列表中存储了指针值),只需进行设置line = NULL;,以便下次点击getline()新行时将被分配。


推荐阅读