【问题标题】:How should I store the first line that got from getline() in c?我应该如何在 c 中存储从 getline() 获得的第一行?
【发布时间】:2016-09-25 08:00:20
【问题描述】:
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 数组中?

【问题讨论】:

    标签: c posix getline


    【解决方案1】:

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

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

    first = strdup(input);
    

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-03-25
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      • 2015-01-04
      • 2012-07-10
      • 2016-12-11
      • 2018-02-03
      相关资源
      最近更新 更多