ACM的fflush(stdin)的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM的fflush(stdin)的问题相关的知识,希望对你有一定的参考价值。

    在最近的刷题过程中,因为用到了很多字符串的操作,有时需要多次清空缓冲区,所以用了fflush(stdin);的语句,确实很好用,但是发现在OJ上提交后会出现runtime error的问题。当时并没有在意是fflush(stdin);的问题,调试好多次后发现会产生runtime错误的代码,于是对fflush(stdin);产生了疑心。

技术分享

 

    上网查阅资料后发现(转自https://my.oschina.net/deanzhao/blog/79790):其实C和C++的标准里从来没有定义过 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) 也没什么大问题。

  但是最重要的是ACM就是为了解决普遍存在的问题,所以必须要有最好的可移植性,对任何问题都很敏感,所以一定不能使用 fflush(stdin) 了,那么怎么清空缓冲区呢?

  使用循环读取输入缓冲区的方法,将缓冲区内数据全部读完,即清空,代码  

  while ( (c = getchar()) != ‘\\n‘ && c != EOF ) ;

  即可。

  另附runtime error的其它可能错误:

 

      ①除以零

 

    ②数组越界:int a[3]; a[10000000]=10;

 

    ③指针越界:int * p; p=(int *)malloc(5 * sizeof(int)); *(p+1000000)=10;

 

    ④使用已经释放的空间:int * p; p=(int *)malloc(5 * sizeof(int));free(p); *p=10;

 

    ⑤数组开得太大,超出了栈的范围,造成栈溢出:int a[100000000];

    (第五个错误在编译时一般会提示错误,第五个数组定义为全局变量即可)

 

 

 

以上是关于ACM的fflush(stdin)的问题的主要内容,如果未能解决你的问题,请参考以下文章

fflush(stdin)和rewind(stdin)

解决linux下fflush(stdin)无效

解决linux下fflush(stdin)无效

搞懂 fflush(stdout)

fflush和标准输入与输出

fflush和标准输入与输出