【问题标题】:How to check if EOF comes first in getline() function in C?如何检查 EOF 是否在 C 中的 getline() 函数中排在第一位?
【发布时间】:2021-03-04 16:35:27
【问题描述】:

我有这个代码:

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 语言的初学者。

【问题讨论】:

  • Getline() 返回一个值(a ssize_t)。使用它。
  • 如果它获得 EOF,它将不会更新 array。仍然是NULL,你不能打电话给strlen()

标签: c char eof getline strlen


【解决方案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;
}

【讨论】:

  • 是的。我的错。修复。谢谢。
  • 非常感谢你们的快速回答。欣赏它。
猜你喜欢
  • 1970-01-01
  • 2011-01-16
  • 2019-11-13
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 2015-10-12
  • 2021-11-27
  • 2016-06-29
相关资源
最近更新 更多