我应该如何在get中存储从getline()得到的第一行?

时间:2016-09-25 08:00:20

标签: c posix getline

int main(){
    char *input = NULL; 
    char *first = NULL;
    size_t len = 100;
    int count = 0;  
    while(getline(&input, &len, stdin)!= EOF){
        if(count == 0){
            first = input;
            printf("------>%s, count = %d\n", first, count);//test printer
        }
        else{
            printf("%d, %s, %s\n", count, input, first);//test printer
        }
        count++;
    }

    return 0;
}

我试图分开两个部分 - 我输入的第一行和第一行后的其余字符串...但我不知道为什么我不能单独成功存储第一行。

为了停止将输入分配给第一个(第一行输入),我使用count来确定我应该在哪里停止,这意味着如果count为零,这意味着我的输入是第一行。然后在while循环中,在您输入的第二行之后,您将打印第二行,第一行...我在else语句上设置测试打印机,我发现第一行在输入第二行时发生了变化。这意味着当跳转到else语句时,首先不是打印我想要的(实际的第一行),而是输入相同的行。

我对此很困惑。为什么价值变了?我应该如何将第一行值存储在单独的char数组中?

1 个答案:

答案 0 :(得分:3)

这是因为你使first指向与input相同的内存。在赋值first = input之后,两个变量都指向相同的内存。

您需要复制字符串,例如,使用例如strdup

first = strdup(input);

另请注意,您使用的是the getline function错误。来自the manual page

  

如果*lineptr在调用之前设置为NULL *n设置为0 ,那么getline()将分配一个用于存储行的缓冲区

对于getline函数来分配内存,您需要将len设置为零。 自己分配内存。如果*n 为零,则上述文本暗示getline调用不分配内存,但使用指针*lineptr,因为它有效并指向已分配内存至少*n个字节。你有一个空指针,这将导致*未定义的行为,因为getline使用该指针并写入它指向的内存。

请记住,如果您要求getline为您分配内存,并使用strdup,那么您需要free该内存。

最后,getline可以修改长度,因此您需要在每次调用之前重置它。