一、 輸入原理
程式的輸入都建有乙個緩衝區,即輸入緩衝區。一次輸入過程是這樣的,當一次鍵盤輸入結束時會將輸入的資料存入輸入緩衝區,而cin函式直接從輸入緩衝區中取資料。正因為cin函式是直接從緩衝區取資料的,所以有時候當緩衝區中有殘留資料時,cin函式會直接取得這些殘留資料而不會請求鍵盤輸入
#1:
#include
using
namespace
std;
intmain
()
測試:abcdefgh (回車)
abcd (輸出)
efgh(輸出)
【分析】之所以第一次輸入完後直接程式就結束了,而不是進行第二次輸入,是因為第一次多輸入的資料還殘留在快取區中,第二次輸入就直接從快取區中提取而不會請求鍵盤輸入
二、 幾種常見的輸入方式
(一) cin>>
該操作符是根據後面變數的型別讀取資料。
輸入結束條件:遇到enter、space、tab鍵。
對結束符的處理:丟棄緩衝區中使得輸入結束的結束符(enter、space、tab)
cin會檢查輸入格式,輸入與預期格式不符時,會返回false,正常情況下則會返回輸入流本身;
#2:
#include
using
namespace
std;
intmain
()
測試:abcd efgh
輸出:abcd
efgh
【分析】第一次讀取字串時遇到空格則停止了,將abcd讀入str1,並捨棄了空格,將後面的字串給了第二個字串。這證明了cin讀入資料遇到空格結束;並且丟棄空格符;緩衝區有殘留資料,讀入操作直接從緩衝區中取資料。
(二)cin.get(陣列名,長度,結束符)
其中結束符為可選引數,讀入的字元個數最多為長度減1個,結束符規定結束字串讀取的字元,預設為enter。
1.讀取字元的情況:
若要讀取字元,直接cin.get(char ch)或ch=cin.get()即可。
輸入結束條件:enter鍵
對結束符處理:不丟棄緩衝區中的enter
cin.get()與cin.get(char ch)用於讀取字元,他們的使用是相似的,即:ch=cin.get()與cin.get(ch)是等價的。若檔案讀取最好使用檔案流.get(ch)。
#3:
#include
using
namespace
std;
intmain
()
測試一輸入:
a[enter]
輸出:a
97 10
測試二輸入:
a b[enter]
輸出:a
97 32
【測試一分析】會發現只執行了一次從鍵盤輸入,顯然第乙個字元變數取的』a', 第二個變數取的是enter(ascii值為10),這是因為該函式不丟棄上次輸入結束時的enter字元,所以第一次輸入結束時緩衝區中殘留的是上次輸入結束時的enter字元!
【測試二分析】顯然第乙個字元變數取的』a', 第二個變數取的是space(ascii值為32)。原因同上,沒有丟棄space字元。
2.讀取字串的情況:
輸入結束條件:預設enter鍵(因此可接受空格,tab鍵),可在第三個引數上自定義結束符
對結束符處理:預設時丟棄緩衝區中的enter,自定義結束符時不丟棄緩衝區中的結束符
#4:
#include
using
namespace
std;
intmain
()
測試一輸入:
12345[enter]
輸出:測試二輸入:
12d45[enter]
輸出:d
【測試一分析】第一次輸入超長,字串按長度取了"1234",而』5′仍殘留在緩衝區中,所以第二次輸入字元沒有從鍵盤讀。
入,而是直接取了』5′,所以列印的ascii值是53(』5′的ascii值)。
【測試二分析】第二次輸出為d,說明自定義結束符時不丟棄緩衝區中的結束符。
(三)cin.getline()
cin.getline(陣列名,長度,結束符) 大體與 cin.get(陣列名,長度,結束符)類似。(實際能讀取長度(-1)個字元,因為字串結尾是0);
區別在於:
cin.get()當輸入的字串超長時,不會引起cin函式的錯誤,後面的cin操作會繼續執行,只是直接從緩衝區中取資料。但是cin.getline()當輸入超長時,會引起cin函式的錯誤,後面的cin操作將不再執行。
#5:
#include
using
namespace
std;
intmain
()
測試輸入:
12345[enter]
輸出:-52
【分析】與cin.get()的例子比較會發現,這裡的ch並沒有讀取緩衝區中的5,而是返回了-52,這裡其實cin>>ch語句沒有執行,是因為cin出錯了!
四 cin.read(c, n)
從字串流中讀取n個字元到c陣列中。
char score[20];
cin.read(score,20);
三、 其它方法
(一)cin.putback(x)
將x內容置入緩衝區。
#1
#include
using
namespace
std;
intmain
()
測試輸入:無輸入
輸出:m
m【分析】將a中資料置入緩衝區後,直接流入b中。
(二)cin.peek()
返回緩衝區中的下乙個字元,但只是檢視,並不從緩衝區中取出。
#2
#include
using
namespace
std;
intmain
()
【分析】程式遇到句號或換行符迴圈停止。句點或換行符仍停留在輸入流中。可見,使用peek的效果相當於先用get()讀取乙個字元,再用putback()將字元放入輸入流中。
(三)cin.ignore(長度,結束符)
cin.ignore(a,ch)方法是從輸入流(cin)中提取字元,提取的字元被忽略(ignore),不被使用。每拋棄乙個字元,它都要計數和比較字元:如果計數值達到a或者被拋棄的字元是ch,則cin.ignore()函式執行終止;否則,它繼續等待。它的乙個常用功能就是用來清除以回車結束的輸入緩衝區的內容,消除上一次輸入對下一次輸入的影響。比如可以這麼用:cin.ignore(1024,'\n'),通常把第乙個引數設定得足夠大,這樣實際上總是只有第二個引數'\n'起作用,所以這一句就是把回車(包括回車)之前的所以字元從輸入緩衝(流)中清除出去。
#3
#include
using
namespace
std;
intmain
()
(四)in.clear()、cin.sync()
cin.clear()是用來更改cin的狀態標示符的。
cin.sync()是用來清除快取區的資料流的。
如果標示符沒有改變那麼即使清除了資料流也無法輸入。所以兩個要聯合起來使用。
例如:#4
#include
using
namespace
std;
intmain
()
(五)in.width(長度)
接收長度-1個字元,其他的放在流中等待接收
#5
#include
using
namespace
std;
intmain
()
return
0;
}
輸入:輸出:
ynew
year
^z(六) 資料進行合法性檢查
cin物件有幾個專門用來報告其工作情況的成員函式,他們將返回乙個真/假值來表明cin的狀態。
-eof():如果到達檔案(或輸入)末尾,返回true;
-fail():如果cin無法工作,返回ture;
-bad():如果cin因為比較嚴重的原因(例如記憶體不足)而無法工作,返回true;
-good():如果以上情況都沒發生,返回true;
c cin常用總結
從標準輸入 鍵盤 寫入的資料會都存放在輸入快取區,當輸入快取區有資料時,cin會直接從輸入快取區讀取,而當輸入緩衝區沒有資料時,cin會掛起請求使用者輸入資料 從標準輸入寫入資料,按enter鍵結束此次輸入,而cin x 讀取一次資料結束的標誌是空白 包括空格,製表符tab,回車 表示式cin x ...
c cin的使用說明
cin是c 程式語言中的標準輸入流物件,即istream類的物件。在理解cin功能時,不得不提標準輸入緩衝區。當我們從鍵盤輸入字串的時候需要敲一下回車鍵才能夠將這個字串送入到緩衝區中,那麼敲入的這個回車鍵 r 會被轉換為乙個換行符 n,這個換行符 n也會被儲存在cin的緩衝區中並且被當成乙個字元來計...
C cin學習筆記
更新中 1.錯誤處理 重要函式 bool cin.good bool cin.bad bool cin.fail bool cin.eof 這四個函式用來測試相應的標誌位是否為1,具體如下 failbit eofbit badbit 所以,ios failbit 100b ios eofbit 01...