如何检查 EOF 是否在 C 的 getline() 函数中排在第一位?

How to check if EOF comes first in getline() function in C?

提问人:Martin Tam 提问时间:11/21/2020 更新时间:11/21/2020 访问量:438

问:

我有这个代码:

int main(void){

  printf("Type something:\n");
  while(1){
    char * array = NULL;
    size_t size = 0;
    
    getline(&array, &size, stdin);

    if( (strlen(array) == 0) && feof(stdin) ){
      free(array);
      return 0;
    };
    
    /* do something else */
    free(array);
  }

  return 0;
}

我想结束我的程序,当输入的第一件事是 EOF,但 valgrind 显示.我知道问题一定是,但不知道如何以不同的方式去做。我能做到:Conditional jump or move depends on uninitialised value(s)strlen(array)

if(feof(stdin)){
  free(array);
  return 0;
}

但是,如果有人键入一个字符串,然后以 EOF 结束它,我的程序也会停止,我不希望这样(因为我需要对该字符串做其他事情)。有什么建议吗?我是C语言的初学者。

c char eof getline strlen

评论

1赞 wildplasser 11/21/2020
Getline() 返回一个值 (a ssize_t)。使用它。
0赞 Barmar 11/21/2020
如果它获得 EOF,它不会更新 .它静止不动,你不能打电话.arrayNULLstrlen()

答:

0赞 Abhijit Mondal 11/21/2020 #1

按照@wildplasser建议,使用以下代码。

int main(void){

  printf("Type something:\n");
  while(1){
    char * array = NULL;
    size_t size = 0;
    
    ssize_t read = getline(&array, &size, stdin);

    if((read < 0 || (strlen(array) == 0)) && feof(stdin) ){
      free(array);
      return 0;
    };
    
    /* do something else */
    free(array);
  }

  return 0;
}

评论

0赞 Abhijit Mondal 11/21/2020
是的。我的错。修复了它。谢谢。
0赞 Martin Tam 11/21/2020
非常感谢你们的快速回答。欣赏它。