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];

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

 

时间: 2024-08-05 02:55:23

ACM的fflush(stdin)的问题的相关文章

fflush(stdin)和fflush(stdout)

转自:http://blog.csdn.net/yeyuangen/article/details/6743416 fflush(stdin)即清理标准输入流,把多余的仍未被保存的数据丢掉. fflush(stdout):清空输出缓冲区,并把缓冲区内容输出 比如,下面这个小程序: void main() { int a; char str[10]; cin>>a; cout<<a<<endl; cin>>str; cout<<str<<

fflush(stdin)和rewind(stdin)

#include <stdio.h> #include <math.h> int main() { double a, b, c, disc, x1, x2, p, q, i; do { scanf_s("a=%lf,b=%lf,c=%lf", &a, &b, &c); i = b*b - 4 * a*c; } while (i<0); printf("输入正确"); disc = b*b - 4 * a*c;

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 stand

getchar fflush 的分析笔记

问题描述: 统计从键盘输入的若干个字符中有效字符的个数,以换行符作为输入结束.有效字符是指第一个空格符前面的字符,若输入字符中没有空格符,则有效字符为除了换行符之外的所有字符. 示例代码: #include<stdio.h> void main() { int count=0,ch; printf("\nPlease input a line char: "); fflush(stdout); while((ch=getchar())!='\n') { if(ch==' '

该怎么清缓存呢?fflush clear ignore

1)fflush 编译器规定,fflush用于刷新输出流,对于输入流没有规定,也就是说 fflush(stdin) 的结果是未知的. 这也就是在 VC下写C程序时,fflush(stdin)有效,VC下写C++程序时,fflush(stdin)无效的原因. 2)VC下写C++程序时,清空缓存使用 clear 和 ignore 1 //重置输入流的状态(从错误中恢复) 2 std::cin.clear(); 3 4 //清空输入流,直到指定的字符(默认为 EOF) 5 std::cin.ignor

【ACM小白成长撸】--计算单词个数

我判断单词个数的方法,根据空格‘ ’的个数 分情况 当没有单词的时候 判断第一个符号,即a[0] == ‘\0’时,赋值给存储个数的数组 当遇到空格时,只有前面一个字符不是空格字符,后面一个字符不是空格字符,才能判断一个word 注意事项: 当输入组数时,最后回车输入缓冲区里面,gets会得到一个回车符号,所以为了消除缓冲区的回车,需要利用fflush函数 当遇到最后一个‘\0’时,要在已有的words数目上加一,比如,"i love you",这儿有2个空格,不加一的话,words数

c语言:C语言清空输入缓冲区在标准输入(stdin)情况下的使用

C语言清空输入缓冲区在标准输入(stdin)情况下的使用 程序1: //功能:先输入一个数字,再输入一个字符,输出hello bit #include <stdio.h> int main() { int num = 0; char ch = ' '; scanf("%d", &num); scanf("%c", &ch); printf("hello bit\n"); system("pause"

ACM实用C语言函数

函数名: abs 功 能: 求整数的绝对值 用 法: int abs(int i); 程序例: #include <stdio.h> #include <math.h> int main(void) { int number = -1234; printf("number: %d absolute value: %d/n", number, abs(number)); return 0; } 函数名: atof 功 能: 把字符串转换成浮点数 用 法: doub

linux中fflush函数和printf函数 【转】

本文转载自:http://blog.chinaunix.net/uid-30058258-id-5029847.html printf是一个行缓冲函数printf函数是标准函数,最终会调用到系统调用函数,printf函数会掉用到write系统函数:但是调用write函数需要满足一些条件件.(1)缓冲区满(2)遇到\n \r(3)调用fflush函数来冲洗缓冲区(4)scanf读取缓冲区的内容(5)调用printf函数的进程或线程结束会调用fflush函数检测缓冲区的大小为1024B.fflush