c - 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
我想知道为什么会这样,谢谢你的帮助。
解决方案
使用 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;
}
推荐阅读
- python - 括号 ()、单方括号[]、双方括号[[]]、大括号{}
- mysql - 如何将某些列及其数据从 csv 文件导入 mysql phpmyadmin
- mysql - 你能在这里解释一下“reference”关键字的含义吗
- angular - 在角度应用程序中读取 Firestore 数据库时间戳并进行比较时出现问题
- postman - 如何使用邮递员从 keycloak 获取访问令牌(授权码流)
- linux - linux 中需要嵌套的 while 循环:- 我有两个变量 A=(a1;b2),B=(A1,B2) 需要像 this1=A1 & b2=B2 这样的输出
- java - 多个嵌套的 Recyclerviews 会降低应用程序的性能
- php - 如何在 cmd 提示符下获取 php-cli 版本 7
- openxml - 演示 OpenXml 包无法找到字体颜色的来源
- json - 如何使用 entityframework ICollection '我的方式'进行序列化