fflush好像不管用

里赫氏冷羽 2014-10-24 01:57:43
在下新学C

#include <stdio.h>
int main()
{
int a;
char c; do
{
scanf("%d",&a);
fflush(stdin);
scanf("%c",&c);
fflush(stdin);
printf("a=%d c=%c\n",a,c); }while(c!='N');
}

可是 fflush(stdin);不能清空缓存区,运行结果如下

root@ubuntu:~/c_programer/10_inputAndOutput$ ./a.out
1a
breaka=1 c=a
1aa
breaka=1 c=a
breaka=1 c=a
...全文
784 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
里赫氏冷羽 2014-10-27
  • 打赏
  • 举报
回复
恩...大神说的对,我用的就是GCC,fflush()不是C/C++标准里定义的函数
引用 2 楼 u013163178 的回复:
C和C++的标准里从来没有定义过 fflush(stdin)。也许有人会说:“可是我用 flush(stdin) 解决了这个问题,你怎么能说是错的呢?”的确,某些编译器(如VC6)支持用 flush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(linux下的gcc就不支持,经我的GCC4.6.2测试),因为标准中根本没有定义 flush(stdin).
Intel0011 2014-10-24
  • 打赏
  • 举报
回复
C/C++ 误区二:fflush(stdin) 1. 为什么 fflush(stdin) 是错的 首先请看以下程序: #include <stdio.h> int main( void ) { int i; for (;;) { fputs("Please input an integer: ", stdout); scanf("%d", &i); printf("%d\n", i); } return 0; } 这个程序首先会提示用户输入一个整数,然后等待用户输入,如果用户输入的是整数,程序会输出刚才输入的整数,并且再次提示用户输入一个整数,然后等待用户输入。但是一旦用户输入的不是整数(如小数或者字母),假设 scanf 函数最后一次得到的整数是 2 ,那么程序会不停地输出“Please input an integer: 2”。这是因为 scanf("%d", &i); 只能接受整数,如果用户输入了字母,则这个字母会遗留在“输入缓冲区”中。因为缓冲中有数据,故而 scanf 函数不会等待用户输入,直接就去缓冲中读取,可是缓冲中的却是字母,这个字母再次被遗留在缓冲中,如此反复,从而导致不停地输出“Please input an integer: 2”。 也许有人会说:“居然这样,那么在 scanf 函数后面加上‘fflush(stdin);’,把输入缓冲清空掉不就行了?”然而这是错的!C和C++的标准里从来没有定义过 fflush(stdin)。也许有人会说:“可是我用 fflush(stdin) 解决了这个问题,你怎么能说是错的呢?”的确,某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(linux 下的 gcc 就不支持),因为标准中根本没有定义 fflush(stdin)。MSDN 文档里也清楚地写着fflush on input stream is an extension to the C standard(fflush 操作输入流是对 C 标准的扩充)。当然,如果你毫不在乎程序的移植性,用 fflush(stdin) 也没什么大问题。以下是 C99 对 fflush 函数的定义: int fflush(FILE *stream); 如果 stream 指向输出流或者更新流(update stream),并且这个更新流 最近执行的操作不是输入,那么 fflush 函数将把这个流中任何待写数据传送至 宿主环境(host environment)写入文件。否则,它的行为是未定义的。 原文如下: int fflush(FILE *stream); If stream points to an output stream or an update stream in which the most recent operation was not input, the fflush function causes any unwritten data for that stream to be delivered to the host environment to be written to the file; otherwise, the behavior is undefined. 其中,宿主环境可以理解为操作系统或内核等。 由此可知,如果 stream 指向输入流(如 stdin),那么 fflush 函数的行为是不确定的。故而使用 fflush(stdin) 是不正确的,至少是移植性不好的。 2. 清空输入缓冲区的方法 虽然不可以用 fflush(stdin),但是我们可以自己写代码来清空输入缓冲区。只需要在 scanf 函数后面加上几句简单的代码就可以了。 /* C 版本 */ #include <stdio.h> int main( void ) { int i, c; for ( ; ; ) { fputs("Please input an integer: ", stdout); scanf("%d", &i); if ( feof(stdin) || ferror(stdin) ) { /* 如果用户输入文件结束标志(或文件已被读完), */ /* 或者发生读写错误,则退出循环 */ /* do something */ break; } /* 没有发生错误,清空输入流。 */ /* 通过 while 循环把输入流中的余留数据“吃”掉 */ while ( (c = getchar()) != '\n' && c != EOF ) ; /* 使用 scanf("%*[^\n]"); 也可以清空输入流, */ /* 不过会残留 \n 字符。 */ printf("%d\n", i); } return 0; } /* C++ 版本 */ #include <iostream> #include <limits> // 为了使用numeric_limits using namespace std; int main() { int value; for ( ; ; ) { cout << "Enter an integer: "; cin >> value; if ( cin.eof() || cin.bad() ) { // 如果用户输入文件结束标志(或文件已被读完), // 或者发生读写错误,则退出循环 // do something break; } // 读到非法字符后,输入流将处于出错状态, // 为了继续获取输入,首先要调用 clear 函数 // 来清除输入流的错误标记,然后才能调用 // ignore 函数来清除输入流中的数据。 cin.clear(); // numeric_limits<streamsize>::max() 返回输入缓冲的大小。 // ignore 函数在此将把输入流中的数据清空。 // 这两个函数的具体用法请读者自行查询。 cin.ignore( numeric_limits<streamsize>::max(), '\n' ); cout << value << '\n'; } return 0; } 参考资料: ISO/IEC 9899:1999 (E) Programming languages— C 7.19.5.2 The fflush function The C Programming Language 2nd Edition By Kernighan & Ritchie ISO/IEC 14882(1998-9-01)Programming languages — C++
mujiok2003 2014-10-24
  • 打赏
  • 举报
回复
http://www.c-faq.com/stdio/stdinflush2.html
mujiok2003 2014-10-24
  • 打赏
  • 举报
回复
fflush是用于输出流的。
hxd198 2014-10-24
  • 打赏
  • 举报
回复
#include <stdio.h> int main() { int a; char c; do { a=-1; printf("请输入一个数字:\n"); scanf("%d",&a); /*scanf()用%d输入字符数据时,由于数据类型不一致,会一直读取数据 导致无限循环 */ if(a==-1) { while(getchar()!='\n') ; printf("输入的数格式不对,请重新输入:\n"); continue; } c='\0'; printf("请输入一个字符:\n"); getchar(); scanf("%c",&c); /* if(c=='\0') { while(getchar()!='\n') ; printf("输入的不是字符,请重新输入:\n"); continue; } */ // fflush(stdin); // fflush(stdin); printf("a=%d,c=%c\n",a,c); } while(c!='N'); } 今天刚学到scanf("%d",&num),也遇到了这问题,上面的方法能解决一部分,但是若输入 12a 之类的还是有BUG,期待大神回复!
「已注销」 2014-10-24
  • 打赏
  • 举报
回复
如果需要清除stdin
while((c=gethcar()) != EOF)
「已注销」 2014-10-24
  • 打赏
  • 举报
回复
C和C++的标准里从来没有定义过 fflush(stdin)。也许有人会说:“可是我用 flush(stdin) 解决了这个问题,你怎么能说是错的呢?”的确,某些编译器(如VC6)支持用 flush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(linux下的gcc就不支持,经我的GCC4.6.2测试),因为标准中根本没有定义 flush(stdin).
hqbobo 2014-10-24
  • 打赏
  • 举报
回复
函数名: fflush 功 能: 清除读写缓冲区,需要立即把输出缓冲区的数据进行物理写入时 头文件:stdio.h 原型:int fflush(FILE *stream) 你的理解没对 其实应该理解为 针对输出的操作 每次当你进行print 或 write 类似操作的时候 系统可能不会直接操作 而保存在缓冲区 这个时候你调用fflush 当前操作就会马上执行...
内容概要:本文研究了一种基于生成对抗网络(GAN)的数据驱动可再生能源场景生成方法,通过构建两个互连的深度神经网络——生成器与判别器,实现对风电与光伏发电出力时间序列的高效建模。该方法克服了传统基于概率统计模型在刻画非线性、强波动性风光数据分布时的局限性,能够有效捕捉复杂的时空相关性与多模态特征,显著提升生成场景的真实性、多样性与时序一致性。研究重点采用Wasserstein GAN(W-GAN)架构,并结合Python编程实现模型训练与验证,展示了其在新能源功率预测、不确定性量化及电力系统优化调度中的应用潜力,配套提供了完整的代码资源以支持复现与拓展。; 适合人群:具备一定机器学习与深度学习基础,从事新能源发电预测、电力系统规划、微电网优化或不确定性建模等相关领域的科研人员、研究生及工程技术开发者;熟悉Python编程并希望将前沿深度学习模型应用于能源时间序列建模的专业人士。; 使用场景及目标:①应对风光发电强随机性与间歇性带来的建模挑战;②生成高质量、多样化的典型出力场景用于鲁棒优化、随机规划与机会约束调度;③支撑储能配置、电力市场仿真、需求响应等决策分析;④探索W-GAN在多变量时间序列生成中的结构设计与训练稳定性优化策略; 阅读建议:此资源强调理论与实践深度融合,建议读者在掌握GAN与Wasserstein距离基本原理的基础上,结合所提供的Python代码进行逐模块调试与实验分析,重点关注损失函数设计、梯度惩罚机制、模型收敛性判断及生成结果评估指标(如分布相似度、自相关性保持等),并可进一步迁移至其他高不确定性的能源数据生成任务中。

70,039

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧