[英]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
參數設置為true
的basic_istream::sentry
類型的 object,它執行以下操作
如果在輸入
failbit
上設置了eofbit
或badbit
,則也設置故障failbit
,並且如果在此輸入流的異常掩碼中啟用了故障位異常,則拋出ios_base::failure
。刷新
tie()
'd output stream,如果適用通過調用
sentry::operator bool()
檢查哨兵的狀態,相當於basic_ios::good
。如果哨兵返回
false
或哨兵的構造函數拋出異常:
將輸入 stream 中提取的字符數 (
gcount
) 設置為零如果調用 function 來寫入
CharT
數組,則將CharT()
(null 字符)寫入數組的第一個位置...
cin.clear();
從cin
和cin.ignore();
忽略接下來的空格數。 由於您將x
聲明為 Integer 並且您先將其寫入,因此控制台希望首先讀取 integer。 如果您首先鍵入abc
而不是鍵入字符串,則控制台返回錯誤標志,因為它需要 integer。 這就是為什么您的程序在此之后立即結束的原因。 如果你把cin.clear();
在cin>>x
之后並鍵入abc
拋出的錯誤標志將被忽略,控制台繼續cin>>k
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.