整理 C 基礎 cin輸入

2021-09-20 03:31:24 字數 3385 閱讀 9780

參考input輸入操作符>>對型別敏感,也就是說它根據待輸入的變數的型別來輸入。比如

int main

如果,鍵入kathy 18>>操作符會將kathy讀入name,18讀入age。為什麼不會將整個輸入kathy 18讀入name呢?這是因為對字串的讀取終止於空格,比如單個空格、換行或者tab字元。此外,空格會被>>忽略掉,如果你在乙個輸入的數字之前鍵入很多空格,>>會忽略那些空格唯讀入數字。

如果不按照型別來輸入會怎麼樣呢?比如我們鍵入18 kathy,18會被作為一連串的字元讀入name,此外,由於kathy不是整數,將不會被讀取到,age的值是乙個無意義的隨機數(程式執行時age所在的記憶體單元儲存的值),這是因為,我們沒有對age進行初始化賦值,也沒有成功地給age讀取乙個值。對於由於輸入格式導致的失敗更詳細的介紹在下一節。

修改上述程式

int

main()

注意,我們可以在一條輸入命令中輸入多個變數的值,同樣,我們也可以在一條輸出命令中輸出多個變數的值。

乙個string>>讀取輸入資料是預設把空格作為終止標誌,也就是說只能讀入單個單詞。但是如果我們想要讀入多個單詞怎麼辦呢?比如我們想要讀入完整的姓名比如kathy chen,最簡單的方法就是使用兩次>>,比如

string first_name, last_name;

cin >> first_name >> last_name;

此外要注意,對於數值型別,在輸入時,我們可以輸入表示式,比如

int age;

cin >> age;

輸入5*2,age的值會讀入為10。

>>是對變數型別敏感的,如果我們鍵入的型別錯誤的資料,比如對於待輸入的整型變數,鍵入了字串,就會發生錯誤,不能繼續輸入。

int

main()

如果輸入test wrtype,會發現num2無法輸入了。因此,num1是int型別的,而wrtype是乙個字串,因此cin進入了錯誤狀態。

在《c++ primer plus》的第六版第六章介紹了cin輸入流的機制:

當遇到無效字元或遇到檔案結束符(不是換行符,是檔案中的資料已讀完)時,輸入流cin就處於出錯狀態,即無法正常提取資料。此時,對cin流的所有提取操作將終止。在 ibm pc及其相容機中,以ctrl + z表示檔案結束符。在unix和macintosh系統中,以 ctrl + d表示檔案結束符。當輸入流cin處於出錯狀態時,如果測試cin的值,可以發現它的值為false(假),即cin為0值。如果輸入流在正常狀態,cin的值為true(真),即cin為 乙個非0值。可以通過測試cin的值,判斷流物件是否處於正常狀態和提取操作是否成功。如:

if

(!cin.

good()

)//if表示式判斷為真時cin輸入流處於出錯狀態,無法正常提取資料

cout<<

"error"

;

常量

含義failbit標記位的值

eofbit標記位的值

badbit標記位的值

轉化為10進製

ios::failbit

輸入(輸出)流出現非致命錯誤,可挽回10

04ios::badbit

輸入(輸出)流出現致命錯誤,不可挽回00

12ios::eofbit

已經到達檔案尾01

01ios::goodbit

流狀態完全正常00

00分別對應cin.fail(), cin.bad(), cin.eof(), cin.good()

c++將輸入看作是流入程式的字元流,iostream檔案定義cin為這種流的物件。對應的輸入都會先存入輸入緩衝區,cin從輸入緩衝區中讀入資料,所以當緩衝區中有資料殘留時,cin直接取得殘留資料而不會請求鍵盤輸入。cin是以空格(單個空格,多個空格,tab,回車)分隔的,空格不進入緩衝區。

cin.clear() 清除cin的錯誤狀態

cin.clear()用處在於如果輸入發生錯誤,那麼流狀態被標記為錯誤,你必須清除這些錯誤狀態,以使你的程式能正確適當地繼續執行。

cin.ignore(int n, char c)

cin.ignore(5, 『c』)是從資料流(cin)中提取字元,提取的字元被忽略(ignore),不被使用。每拋棄乙個字元,它都要技術和比較字元,如果計數值達到5或者被拋棄的字元是』c』,則函式指定終止,否則它繼續等待輸入。如果你用ignore(4)而緩衝區中只有三個字元,那麼接下來的輸入的那個也要被ignore。==它的乙個常用功能就是用來清除以回車結束的輸入緩衝區的內容,消除上一次輸入對下一次輸入的影響。

// 把回車之前(上一次輸入)的字元從輸入緩衝區中清除出去

std::cin.

clear()

;// to be safe, clear error flags which may be set

std::cin.

ignore

(std::numeric_limits<

int>

::max()

,'\n'

);

cin.sync 輸出與輸入同步,如果這時候緩區不空就列印出來。sync時輸入輸出都清空,輸入是丟掉,輸出是列印出來。網上很多說法是用於清空輸入緩衝區,但這個東西的原意是同步輸入流,由於各個編譯器對同步功能的實現不同,很可能無法清空緩衝區,因此,建議使用cin.ignore來完成清空緩衝區的操作。

does cin.sync() always work?

關於cin.sync()的解釋

重置cin以接受新的輸入

刪除錯誤輸入

提示使用者再輸入

第一步重置cin以接受新的輸入是要最先做的,一般用成員函式clear();形式為cin.clear();如果省略這條語句,程式將拒絕繼續讀取輸入。cin.clear()是用來更改cin的狀態標示符的。通俗的講就是將乙個出錯的「流」恢復為「好」,並設定goodbit狀態位。

示例:

int

main()

return0;

}

<>

c++ 的cin輸入注意***----cin的狀態

cin標準輸入流的錯誤處理

C 輸入cin詳解

輸入原理 程式的輸入都建有乙個緩衝區,即輸入緩衝區。一次輸入過程是這樣的,當一次鍵盤輸入結束時會將輸入的資料存入輸入緩衝區,而cin函式直接從輸入緩衝區中取資料。正因為cin函式是直接從緩衝區取資料的,所以有時候當緩衝區中有殘留資料時,cin函式會直接取得這些殘留資料而不會請求鍵盤輸入 1 incl...

C 輸入cin詳解

輸入原理 程式的輸入都建有乙個緩衝區,即輸入緩衝區。一次輸入過程是這樣的,當一次鍵盤輸入結束時會將輸入的資料存入輸入緩衝區,而cin函式直接從輸入緩衝區中取資料。正因為cin函式是直接從緩衝區取資料的,所以有時候當緩衝區中有殘留資料時,cin函式會直接取得這些殘留資料而不會請求鍵盤輸入 1 incl...

C 輸入cin詳解

輸入原理 程式的輸入都建有乙個緩衝區,即輸入緩衝區。一次輸入過程是這樣的,當一次鍵盤輸入結束時會將輸入的資料存入輸入緩衝區,而cin函式直接從輸入緩衝區中取資料。正因為cin函式是直接從緩衝區取資料的,所以有時候當緩衝區中有殘留資料時,cin函式會直接取得這些殘留資料而不會請求鍵盤輸入 1 incl...