首页 > 解决方案 > fgets inside loop 在遇到 EOF 后不等待输入

问题描述

我在 while 循环中使用 fgets 来获取使用输入,如果我使用 ctrl-d 在行首发送 EOF,则 fgets 返回 NULL(因为它遇到 EOF),并且终端打印“!!!”,但是问题是在 fgets 函数不等待输入之后,终端一直打印“错误”直到循环结束。我期待 fgets 将等待每个循环的输入。

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{

    int argNums = 0;
    while(argNums < 20){
        char argBuf[100];
        if(fgets(argBuf, 100, stdin) != NULL){
            printf("!!!");
        }else{
            printf("ERROR ");
            //exit(1);
        }
        argNums++;
    }
    return 0;
}

这是输出

1
!!!2
!!!ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR 

我想知道为什么会这样,谢谢你的帮助。

标签: clinuxfgets

解决方案


使用 clearerr():

C 库函数 void clearerr(FILE *stream) 清除给定流的文件结尾和错误指示符。

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{

    int argNums = 0;
    while(argNums < 20){
        char argBuf[100];
        if(fgets(argBuf, 100, stdin) != NULL){
            printf("!!!");
        }else{
            printf("ERROR ");
            clearerr(stdin);
            //exit(1);
        }
        argNums++;
    }
    return 0;
}

推荐阅读