昨天做題的時候,遇到乙個輸入是這樣的
3
4aaaa aaaa aaaa
bbbbbbb bbbb
ccc cccccccc
^d
第一行輸入乙個整數n,表示接下來句子的數量,和另外乙個整數(這裡沒有作用,只是用來說明下面的乙個情況),接下來就是n個句子,每個句子以回車結束。
我的想法是
int i, j;
cin >> i >> j;
while(i--)
可是,結果是我第一次呼叫getline返回的是「」(空字串)。這是為什麼呢?
原因是cin有它的緩衝區,當我們在標準輸入輸入回車之後,會將我們的輸入放到它的緩衝區,然後cin就開始在緩衝區讀。 cin的》操作符,預設是以空格,製表符作為分隔符的。
當我們輸入3 4
換行之後,輸入緩衝區讀到的內容是3 4\n
,cin >> 操作符將3 4
讀取之後賦給i,j,緩衝區裡面剩下\n
,下乙個getline來讀的時候就返回空字串了。
乙個解決方法,用cin.get()吸收掉緩衝區的\n
字元。
int i, j;
cin >> i >> j;
cin.get();
while(i--)
其實,我之前一直認為cin >> 操作符是以空格,製表符,回車作為分隔符的,對於**cin >> i >>j;
,我曾經這麼輸入。
2
3
這樣i,j讀到的也是2,3,所以我就以為cin >> 也可以以回車作為分隔符。今天我查資料才發現,cin >> j的時候,緩衝區裡面是有\n3
的,只是它為j賦值的時候忽略掉\n
而已。
在找這個問題的原因的時候我發現乙個更有意思的事情。
cin.clear()
int a;
char b;
int ret = 0;
cout
<< "input a:"
<< endl;
cin >> a;
cout
<< "a:"
<< a << endl;
cout
<< "input b:"
<< endl;
cin >> b;
cout
<< "b:"
<< b << endl;
這行**如果輸入的不是數字而是字元的話,會導致乙個死迴圈,因為第一次賦值給a的時候,賦值失敗了,cin就會給自己設乙個狀態iostate state = badbit
這就會導致cin不能正常工作,cin >> b也不能正常工作了。
下面是我的輸入:
➜ stl git:(master) ✗ g++ input.cpp -o input
➜ stl git:(master) ✗ ./input
input a:
asdf
a:0input b:
b:
這裡我給a賦了個字元,然後cin >> b就直接返回了,沒有再給機會輸入b,也沒有辦法讓b正確賦值。
int a;
char b;
int ret = 0;
cout
<< "input a:"
<< endl;
cin >> a;
cout
<< "a:"
<< a << endl;
cin.clear(); //加了這一句
cout
<< "input b:"
<< endl;
cin >> b;
cout
<< "b:"
<< b << endl;
在cin錯誤之後,將狀態設定回iostate state = goodbit
,這樣我的b就能從緩衝區讀取我之前的輸入。我的輸入
➜ stl git:(master) ✗ g++ input.cpp -o input
➜ stl git:(master) ✗ ./input
input a:
asdf
a:0input b:
b:a
cin.ignore() and cin.sync()
網上有人說這兩個語句都是用來清空輸入緩衝區,也就是說回到我第乙個談到的問題,我輸入數字之後回車,\n
存放在輸入緩衝區的最開始,那我就可以通過這兩個語句來將輸入緩衝區清空,然後再讀取其他輸入。
cin.ignore()是丟棄輸入緩衝區的乙個字元,istream& ignore (streamsize n = 1, int delim = eof);
,還可以丟棄n個字元,或拋棄到以delim結尾字元。 這是推薦使用的清空緩衝區的方法。
cin.sync()這個的實際功能依賴於具體實現,我在g++中使用這個函式沒有作用,後來在下面這篇文章看到原因。
這篇文章講到了cin.sync()具體功能依賴於實現, vc++將cin.sync()實現為清空現有緩衝區,而g++什麼都不做。
C 標準輸入
cin是c 程式語言中的標準輸入流物件,即istream類的物件。cin主要用於從標準輸入讀取資料,這裡的標準輸入,指的是終端的鍵盤。此外,cout是流的物件,即ostream類的物件,cerr是標準錯誤輸出流的物件,也是ostream 類的物件。這裡的標準輸出指的是終端鍵盤,標準錯誤輸出指的是終端...
C 的標準輸入與標準輸出
標準輸入輸出是相對於程式而言的,輸入指的是從io裝置輸入到程式中,輸出指的是從程式中向io裝置輸出。使用型別為istream的cin物件處理輸入,使用型別為ostream的cout物件處理輸出。另外兩個ostream型別的輸出物件為cerr和clog。向流寫入資料 std cout hello wo...
c 標準輸入流
cin是istream類的派生類物件,它從標準輸入裝置 鍵盤 獲取資料,程式中的變數通過流提取符 從流中提取資料。提取資料時通常跳過輸入流中的空格,tab鍵,換行符等空白字元。只有在鍵盤輸入完資料並按enter鍵之後,該行資料才被送入鍵盤緩衝區,形成輸入流,提取運算子 才能從中提取資料 在遇到無效字...