Skip to main content
 首页 » 编程设计

c之使用 fgets 读取输入(进入无限循环)

2026年05月17日17sky-heaven

我有这个应用程序,它使用 fgets 读取用户输入。如果我在程序运行时接受用户输入,它工作正常并且没有问题。但是,如果我输入一个文件说“./myprog < in.txt”,它会进入无限循环并打印我在用户未在整个屏幕上提供有效输入时显示的自定义错误消息。就像按下回车键一样。我该如何解决这个问题?

这是我的程序中有 fgets 的一部分

while(1){ 
  mainMenu(&choice); 
  switch(choice) 
  { 
     case 0:  
        return 0; 
 
     case 1: //Add movies  
        getMovieData(&list); 
        break; 
 
     case 2: 
        ....some initialization...  
        printf("Provide a name to delete : "); 
        fgets(inputBuffer,sizeof(inputBuffer),stdin); 
    trimWhiteSpace(inputBuffer); 
        deleteMovie(&list,inputBuffer); 
        break; 
 
     case 3: //List all movies 
        printMovieData(list); 
        break; 
 
     case 4: //List movies by genre 
        inputBuffer[0] = '\0'; 
        printf("....."); 
    fgets(inputBuffer,sizeof(inputBuffer),stdin);                
        trimWhiteSpace(inputBuffer); 
        if(!isNum(inputBuffer,&genreChoice)){  
           showMessage("Number Expected\n"); 
           break; 
        } 
        else if(!checkNumberValidity(&genreChoice,1,6)){ 
           showMessage("Choose from 1 to 7\n"); 
           break; 
        } 
        else printMoviesByGenre(list,getGenre(genreChoice-1)); 
        break; 
 
  } 

while(1){ 
  printf("Provide the number of movies you would like to enter: "); 
  fgets(temp, sizeof(temp), stdin); 
  trimWhiteSpace(temp);          
  if(!isNum(temp,&numMovie)) printf("Enter a numeric value\n"); 
  else if(!checkNumberValidity(&numMovie,1,MAX_MOVIES)) printf("No greater than %d\n",MAX_MOVIES);   
  else break; 

}

请您参考如下方法:

检查fgets 的返回值。失败时返回 NULL。在流的末尾,fgets 返回 NULL 并且 feof(file) 将为 != 0,表明您已到达流的末尾(EOF,文件末尾)。

正如 Charlie Burns 所说,您必须在输入结束时退出,因此请执行以下操作:

if (fgets(temp, sizeof(temp), stdin) == NULL) 
    exit(EXIT_SUCCESS); 

... 在您的 while(1) 循环中。

相关:fgets and dealing with CTRL+D input