日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一个关于clear()、吸收缓存区的帖子引发的思考

發布時間:2024/4/18 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一个关于clear()、吸收缓存区的帖子引发的思考 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(1)辦法1:當你strm.clear()后流仍然不能用的時候,那么加一句

while(cin.get() != '\n'),那么會自動把緩存器讀完。這樣流就可以繼續使用了。strm表示流(e.g.iostream、istream、istringstream、ifstream、fstream,etc..)。

(2)辦法2:當你的流發生錯的時候,即使執行了strm.clear()后,也未必可以使用,這是因為這個流還會跑去緩存區去讀那個錯誤的東西,當然會繼續引發錯誤了。所以執行strm.clear()后,必須馬上執行清楚緩存,比如cin.ignore(100,'\n')表示讀取100個字符或者遇到'\n'后結束。

cin.ignore(a,b)表示:一直從cin中讀取,一直讀取到a個數據或者遇到字符b的時候結束。。。

c++ cin.clear()到底是什么意思呢
int i;
for(i=0;i<num;i++)
{
int temp;
cout<<"Please input the # "<< (i+1)<<" number: "<<endl;
cin>>temp;
if(!cin)
{
cin.clear();
while(cin.get()!='\n')
continue;
cout<<"Bad input"<<endl;
break;
}
else if(temp<0)
break;
array[i]=temp;

能不能詳細地解釋一下if(!cin)
{
cin.clear();
while(cin.get()!='\n')
continue;
cout<<"Bad input"<<endl;
break;
}
這段語句里if(!cin),clear()和while的那條語句到底是干什么的呢,為什么一定要while和clear的那條語句呢,求解求解,謝謝


4個回答#熱議# 閏四月究竟是怎么推算的?
南瓜蘋果i
2020-05-17
當cin函數輸入錯誤的時候,cin里面有個函數可以自動檢測到輸入錯誤,若想繼來續輸自入便要清楚掉這個錯誤。可以利用函數cin.rdstate()函數來讀取錯誤的標識符看看。
#include <iostream>using namespace std;int main(){

int number;

cin>>number;

cout<<"first input"<<endl;

cout<<cin.rdstate()<<endl;

cin>>number;
cout<<"end input!bai"<<endl;

system("pause");

return 0;}


擴展資料

c++中的cin函數語法

C++中的cin函數和C語言的scanf函數同理,均為從鍵盤中接收輸入內容。

基本格式:cin>>要輸入的du內容;

cin函數輸入遇到空格,TAB鍵,回車也會終止輸入
例如:想要zhi輸入zhang san

cin>>str;那么str只會接收zhang這個字符串,遇到空格自動結束輸入。

C++中提供cin.getline(str,50),此時只遇到回車才會結dao束輸入,那么str中存儲了zhang san這個完整的字符串。

?搶首贊 ? ?評論 分享 舉報收起
匿名用戶
推薦于2017-11-24
if(!cin)判斷是否輸入2113正確,如果輸入錯誤的類型 比如你想輸入 int類型 結果輸入了char 則會出現5261cin輸入錯誤
fail() 被設定為真 failbit被設定 cin被標記錯誤 不可用( 意思是4102 出現不匹配 )然后就得用clear()清除錯誤狀1653態 就是清除錯誤狀態 (也就是把failbit設置為0)然后還得用 while(cin.get()!='\n')
continue;
吸收緩沖區 也就是錯誤字符后版面的字符之類的 知道換行符 例如想輸入 123 結果輸入123ab456。。。就用上面的做法 解決了 發現cin又可用了權。。。
更多追問追答
追問
就是說如果輸入123ab456的話,首先會接受到123,然后if(!cin)發現不是匹配的類型,出錯,failbit被設定了,然后用clear()把被設定的failbit修改到原來的狀態,接著繼續接受456,直至遇到換行?所謂的while(cin.get()!='\n')吸收緩沖區是指?
追答
哦 是這樣的 因為遇到了a所以會把cin的failbit設定為1 ?所以會出現cin錯誤 所以ab456依然留在緩沖區 (因為cin是靠緩沖區讀取的 其中123ab456從鍵盤輸入保存在緩沖區) 用clear() 清除的 是狀態 也就是failbit 設置為0 讓 cin可用 但是如果不清除緩沖區 則在讀取緩沖區的a時 又被設定failbit=1 所以 只能用while(cin.get()!='\n') 去讀取掉剩下的緩沖區 直至遇到換行 (也就是讀取ab456和\n 直到退出while)這樣就可用cin繼續從鍵盤到緩沖區 中讀取int了

注意一點:你想不是正確的(failbit被設定了,然后用clear()把被設定的failbit修改到原來的狀態,接著繼續接受456) 不是這樣的 cin不會這樣讀取 應該是清除狀態 只是讓它可用 ?他還會繼續去讀ab456 ?但是繼續碰到'a’還是設置 failbit=1 不會跳過ab去讀456


fergus1987
2019-09-03fergus1987
采納數:5 獲贊數:17LV5
擅長:電腦/網絡 電子數碼 娛樂休閑 資源共享
向TA提問 私信TA
實際測試來了一下樓上大神的解源答思路發現一些問題:
輸入字母開頭時 例如baia123 b456 代碼會報錯“Bad input”
但當數字du開頭連接字母時 例如zhi123a 4bc 代碼正常運行 不會報錯
大家可以試dao試
?1 ? ?評論(1) 分享 舉報
隰有苓3點14159
2018-11-01
非常感謝,在讀C++ Primer也碰到此問題
?9 ? ?評論 分享 舉報

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的一个关于clear()、吸收缓存区的帖子引发的思考的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。