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;
?
?、壑羔樤浇?#xff1a;int?*?p;?p=(int?*)malloc(5?*?sizeof(int));?*(p+1000000)=10;
?
④使用已經釋放的空間:int?*?p;?p=(int?*)malloc(5?*?sizeof(int));free(p);?*p=10;
?
?、輸到M開得太大,超出了棧的范圍,造成棧溢出:int?a[100000000];
(第五個錯誤在編譯時一般會提示錯誤,第五個數組定義為全局變量即可)
?
?
?
轉載于:https://www.cnblogs.com/hgcrown/p/6480007.html
總結
以上是生活随笔為你收集整理的ACM的fflush(stdin)的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vnetclient.exe是什么
- 下一篇: 在word中怎么将一系列的数字相加求和