簡體   English   中英

cin.ignore() 不能刪除輸入緩沖區

[英]cin.ignore() can not remove input buffer

我有一個問題cin.ignore()無法從緩沖區中刪除輸入。

#include <iostream>
#include <string>

int main() {
    using namespace std;

    int x=0;
    string k;
    cin >> x;
    cin.ignore(100,'\n');
    cin.clear();
    cin >> k;
    cout << k << endl;
}

對於上面的代碼:

input : abc (program ends when I just input abc)
output : abc

我真的很驚訝,因為cin.ignore()沒有從輸入緩沖區中刪除"abc"

我的代碼有什么問題?

如果我改變cin.ignore()cin.clear()的位置,效果很好,這是為什么呢?

這段代碼:

int x=0;
cin >> x;

如果輸入不可轉換為int ,則導致cin進入錯誤failbit (特別是設置了故障位標志)。

每個cppreference.com

std::basic_istream<CharT,Traits>::operator>>

這個 function 表現為FormattedInputFunction 在構造和檢查哨兵 object(可能會跳過前導空格)后,通過調用std::num_get::get()提取 integer 值。

...

如果提取失敗(例如,如果在需要數字的地方輸入了一個字母),則value保持failbit並設置失敗位。 (直到 C++11)

如果提取失敗,則將零寫入value並設置failbit 對於有符號整數,如果提取導致值太大或太小而無法放入value ,則分別寫入std::numeric_limits<T>::max()std::numeric_limits<T>::min()並且設置failbit標志 對於無符號整數,如果提取導致值太大或太小而無法放入value ,則寫入std::numeric_limits<T>::max()並設置failbit標志 (C++11 起)

...

因此,stream 上的任何進一步 I/O 操作都將被禁用,例如ignore() ,直到您clear()錯誤 state 以重新啟用 I/O。

std::basic_ios<CharT,Traits>::clear

通過分配 state 的值來設置 stream 錯誤state標志。 默認情況下,分配std::ios_base::goodbit具有清除所有錯誤 state flags 的效果

std::basic_istream<CharT,Traits>::ignore

ignore表現為UnformattedInputFunction 構建並檢查哨兵object后,從stream中提取字符並丟棄,直到出現以下任一情況:

...

C++ 命名要求: UnformattedInputFunction

UnformattedInputFunction是 stream 輸入 function 執行以下操作:

  • 構造一個具有自動存儲持續時間且noskipws參數設置為truebasic_istream::sentry類型的 object,它執行以下操作

    • 如果在輸入failbit上設置了eofbitbadbit ,則也設置故障failbit ,並且如果在此輸入流的異常掩碼中啟用了故障位異常,則拋出ios_base::failure

    • 刷新tie() 'd output stream,如果適用

  • 通過調用sentry::operator bool()檢查哨兵的狀態,相當於basic_ios::good

  • 如果哨兵返回false或哨兵的構造函數拋出異常:

    • 將輸入 stream 中提取的字符數 ( gcount ) 設置為零

    • 如果調用 function 來寫入CharT數組,則將CharT() (null 字符)寫入數組的第一個位置

...

cin.clear(); cincin.ignore(); 忽略接下來的空格數。 由於您將x聲明為 Integer 並且您先將其寫入,因此控制台希望首先讀取 integer。 如果您首先鍵入abc而不是鍵入字符串,則控制台返回錯誤標志,因為它需要 integer。 這就是為什么您的程序在此之后立即結束的原因。 如果你把cin.clear(); cin>>x之后並鍵入abc拋出的錯誤標志將被忽略,控制台繼續cin>>k

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM