ACM的fflush(stdin)的问题
? ? 在最近的刷題過程中,因?yàn)橛玫搅撕芏嘧址牟僮?#xff0c;有時(shí)需要多次清空緩沖區(qū),所以用了fflush(stdin);的語句,確實(shí)很好用,但是發(fā)現(xiàn)在OJ上提交后會(huì)出現(xiàn)runtime error的問題。當(dāng)時(shí)并沒有在意是fflush(stdin);的問題,調(diào)試好多次后發(fā)現(xiàn)會(huì)產(chǎn)生runtime錯(cuò)誤的代碼,于是對(duì)fflush(stdin);產(chǎn)生了疑心。
?
? ? 上網(wǎng)查閱資料后發(fā)現(xiàn)(轉(zhuǎn)自https://my.oschina.net/deanzhao/blog/79790):其實(shí)C和C++的標(biāo)準(zhǔn)里從來沒有定義過 fflush(stdin)。某些編譯器(如VC6)支持用 fflush(stdin) 來清空輸入緩沖,但是并非所有編譯器都要支持這個(gè)功能(linux 下的 gcc 就不支持),因?yàn)闃?biāo)準(zhǔn)中根本沒有定義 fflush(stdin)。MSDN 文檔里 也清楚地寫著fflush on input stream is an extension to the C standard(fflush 操作輸入流是對(duì) C 標(biāo)準(zhǔn)的擴(kuò)充)。當(dāng)然,如果你毫不在乎程序的移植性,用 fflush(stdin) 也沒什么大問題。
但是最重要的是ACM就是為了解決普遍存在的問題,所以必須要有最好的可移植性,對(duì)任何問題都很敏感,所以一定不能使用?fflush(stdin) 了,那么怎么清空緩沖區(qū)呢?
使用循環(huán)讀取輸入緩沖區(qū)的方法,將緩沖區(qū)內(nèi)數(shù)據(jù)全部讀完,即清空,代碼 ?
while?(?(c?=?getchar())?!=?'\n'?&&?c?!=?EOF?)?;
即可。
另附runtime error的其它可能錯(cuò)誤:
?
?①除以零
?
②數(shù)組越界:int?a[3];?a[10000000]=10;
?
③指針越界:int?*?p;?p=(int?*)malloc(5?*?sizeof(int));?*(p+1000000)=10;
?
④使用已經(jīng)釋放的空間:int?*?p;?p=(int?*)malloc(5?*?sizeof(int));free(p);?*p=10;
?
⑤數(shù)組開得太大,超出了棧的范圍,造成棧溢出:int?a[100000000];
(第五個(gè)錯(cuò)誤在編譯時(shí)一般會(huì)提示錯(cuò)誤,第五個(gè)數(shù)組定義為全局變量即可)
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/hgcrown/p/6480007.html
總結(jié)
以上是生活随笔為你收集整理的ACM的fflush(stdin)的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vnetclient.exe是什么
- 下一篇: 关于996,我想说的 - 人在高潮享受成