C 使用FGET读取输入(进入无限循环)

C 使用FGET读取输入(进入无限循环),c,linux,fgets,C,Linux,Fgets,我有一个应用程序,它用fgets读取用户输入。若我在程序运行时接受用户输入,它运行良好,并没有问题。但如果我输入一个文件,比如“/myprog

我有一个应用程序,它用fgets读取用户输入。若我在程序运行时接受用户输入,它运行良好,并没有问题。但如果我输入一个文件,比如“/myprog 这是我的程序的一部分,有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;

  }
}


}我不认为无限循环来自
fgets
。但是它没有很好地声明
fgets(inputBuffer,sizeof(inputBuffer),stdin)第二个参数必须是一个大小,该大小表示要读取多少字符。向我们显示在无限循环中看到的printf的位置。

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

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

if (fgets(temp, sizeof(temp), stdin) == NULL)
    exit(EXIT_SUCCESS);
。。。在
while(1)
循环中


相关:

这将循环直到选项为0,选项由getMenu确定。所以也许你的问题在getMenu?如果我在文本文件中以零结尾,它就没有问题了。它只是在最后退出到shell。如果我不这样做,它就会进入无休止的循环。在这种情况下,getMenu会反复地将choice设置为非零,从而重复打印。fgets()可能返回NULL。你也可以用它来返回。正如其中一个答案所说,你需要检查fgets的NULL返回值并返回/退出。为了确定,当你以交互方式使用你的程序(或在Windows上按Ctrl-Z)时,当你点击Ctrl-D时会发生什么,看看它是否执行你看到的printf循环。我刚刚更新了我的帖子。当用户未提供有效输入时,我会显示此消息。这就像用户一直按住enter键一样。
if (fgets(temp, sizeof(temp), stdin) == NULL)
    exit(EXIT_SUCCESS);