c++ cin 作為while條件(詳解)
本文一切測試在windows clion中進行
在clion中,ctrl +z并不是文件結(jié)束符
在cmd中運行,只需要ctrl+z再加回車就可以得到正確結(jié)果
1、cin
cin是C++編程語言中的標(biāo)準(zhǔn)輸入流對象,即istream類的對象。cin主要用于從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù),這里的標(biāo)準(zhǔn)輸入,指的是終端的鍵盤。此外,cout是流的對象,即ostream類的對象,cerr是標(biāo)準(zhǔn)錯誤輸出流的對象,也是ostream 類的對象。這里的標(biāo)準(zhǔn)輸出指的是終端鍵盤,標(biāo)準(zhǔn)錯誤輸出指的是終端的屏幕。
在理解cin功能時,不得不提標(biāo)準(zhǔn)輸入緩沖區(qū)。當(dāng)我們從鍵盤輸入字符串的時候需要敲一下回車鍵才能夠?qū)⑦@個字符串送入到緩沖區(qū)中,那么敲入的這個回車鍵(\r)會被轉(zhuǎn)換為一個換行符\n,這個換行符\n也會被存儲在cin的緩沖區(qū)中并且被當(dāng)成一個字符來計算!比如我們在鍵盤上敲下了123456這個字符串,然后敲一下回車鍵(\r)將這個字符串送入了緩沖區(qū)中,那么此時緩沖區(qū)中的字節(jié)個數(shù)是7 ,而不是6。
cin讀取數(shù)據(jù)也是從緩沖區(qū)中獲取數(shù)據(jù),緩沖區(qū)為空時,cin的成員函數(shù)會阻塞等待數(shù)據(jù)的到來,一旦緩沖區(qū)中有數(shù)據(jù),就觸發(fā)cin的成員函數(shù)去讀取數(shù)據(jù)。當(dāng)cin>>從緩沖區(qū)中讀取數(shù)據(jù)時,若緩沖區(qū)中第一個字符是空格、tab或換行這些分隔符時,cin>>會將其忽略并清除,繼續(xù)讀取下一個字符,若緩沖區(qū)為空,則繼續(xù)等待。但是如果讀取成功,字符后面的分隔符是殘留在緩沖區(qū)的,cin>>不做處理。
使用一個istream的對象作為條件時,效果是檢查流的狀態(tài)。若流有效,則檢測成功,返回true。當(dāng)遇到文件結(jié)束符或者無效的輸入(比如用一個字符來作為一個整型數(shù)的輸入時),istream的對象狀態(tài)會變?yōu)闊o效。
總而言之:
(1) 輸入數(shù)據(jù)時需要敲回車鍵才能將數(shù)據(jù)送到緩存器,cin才能讀取緩存區(qū)的數(shù)據(jù)。
(2) 當(dāng)cin遇到文件結(jié)束符(windows中為:ctrl +Z , Unix 中為:ctrl +D),或無效輸入才能使cin狀態(tài)無效。
一下這段測試代碼將說明以上問題。
代碼作用: 統(tǒng)計輸入值中數(shù)據(jù)連續(xù)出現(xiàn)的次數(shù)。
因為無法判斷輸入數(shù)據(jù)的個數(shù),所以無法采用一個定值來控制循環(huán)次數(shù)。這里我們使用cin來作為if 條件:
#include <iostream> using std::cin; using std::cout; using std::endl; int main() { cout << "Enter a list of integers:" << std::endl; int currVal = 0; int val = 0; int cnt = 0; /*讀入第一個輸入的數(shù)據(jù)*/ if ( cin >> currVal ){ cnt = 1; /*循環(huán)讀入之后的數(shù)據(jù)*/ while( cin >> val ){ /*如果當(dāng)前讀入的數(shù)據(jù)val與之前的數(shù)據(jù)currVal相等,cnt++*/ if (currVal == val) { ++cnt; } else { /*如果不相等,輸出之前數(shù)據(jù)currVal連續(xù)出現(xiàn)的次數(shù),同時重新統(tǒng)計當(dāng)前數(shù)據(jù)的連續(xù)出現(xiàn)次數(shù)*/ cout << currVal << " occurs " << cnt << " times. " << endl; currVal = val; cnt = 1; } } /*打印最后一個數(shù)據(jù)的連續(xù)出現(xiàn)次數(shù)*/ cout << currVal << " occurs " << cnt << " times. " << endl; } return 0; }
(1)控制臺輸入 1 2 3 4 5 6 7加回車:
7的統(tǒng)計并沒有顯示,因為這個時候我們只是將數(shù)據(jù)push到了緩沖區(qū),while中的cin讀取到7,流的檢測狀態(tài)是true,所以并沒有退出循環(huán),還在等待下一個輸入數(shù)據(jù),不能執(zhí)行while循環(huán)之外的代碼,因此不能打印最后下一個數(shù)據(jù)7。
(2)控制臺輸入 1 2 3 4 5 6 7加ctrl+D:
直接以ctrl+d結(jié)束數(shù)據(jù),數(shù)據(jù)1到7沒有提交到緩沖區(qū),而if中的cin直接讀取到文件結(jié)束符,流狀態(tài)檢測為false,if中的代碼不能執(zhí)行,直接結(jié)束程序運行。
(3)控制臺輸入1 2 3 4 5 6 7加回車:
再輸入ctrl+D:
1到6的輸出如(2)中所述,等我們再次輸入文件結(jié)束符號時,cin流狀態(tài)為false,結(jié)束while循環(huán),因此執(zhí)行while循環(huán)之外的代碼,打印出最后一個數(shù)據(jù)7 的統(tǒng)計次數(shù)。
(4)控制臺輸入1 2 3 4 5 6 7 t 加回車:
我們輸入1到7和t之后,再enter,將數(shù)據(jù)push到緩沖區(qū)。在while循環(huán)的條件中,cin逐個讀入到val中,再執(zhí)行循環(huán)體中的代碼,最后讀到t時,企圖將字符存入到int型的變量中,無效輸入導(dǎo)致流狀態(tài)為false,種植while循環(huán),可以打印出最后一個數(shù)據(jù)的統(tǒng)計信息。
以上這篇c++ cin 作為while條件(詳解)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持我們。
欄 目:C語言
下一篇:C++ 中約瑟夫環(huán)替換計數(shù)器m(數(shù)組解決)
本文標(biāo)題:c++ cin 作為while條件(詳解)
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/1613.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10用C++實現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實現(xiàn)與遞歸實現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10深入C/C++浮點數(shù)在內(nèi)存中的存儲方式詳解
- 01-10深入理解C/C++混合編程


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 01-11ajax實現(xiàn)頁面的局部加載
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實例總結(jié)
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置