C:将 getline() 创建的字符串存储在链表中?
C: Store strings created by getline() in a Linked list?
我需要在 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 的副本。
一旦你将 line
存储到列表中(因为在列表中存储指针值),只需设置 line = NULL;
以便下次你点击 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 的副本。
一旦你将 line
存储到列表中(因为在列表中存储指针值),只需设置 line = NULL;
以便下次你点击 getline()
一个新的线路将被分配。