C 的標準輸入

2021-07-29 20:14:16 字數 2673 閱讀 9407

昨天做題的時候,遇到乙個輸入是這樣的

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鍵之後,該行資料才被送入鍵盤緩衝區,形成輸入流,提取運算子 才能從中提取資料 在遇到無效字...