[英]Clearing cin input: is cin.ignore not a good way?
清除cin
輸入的更好方法是什么? 我認為cin.clear
和cin.ignore
是一個好方法?
碼:
void clearInput()
{
cin.clear();
cin.ignore(1000,'\n');
//cin.ignore( std::numeric_limits<streamsize>::max(), '\n' );
}
我老師給了我這個回復:
這基本上是說你的clearInput不起作用FYI:忽略絕不是一個好主意,可以擺脫所有遺留在一條線上
而你的測試失敗正是為什么現在以正確的方式清除它的原因
她還告訴我以下內容:
忽略你需要猜測你想忽略多少個字符如果你絕對知道你的數據並且它遵循嚴格的格式 - 就像在Excel電子表格中那樣,忽略非常好。 如果你不在這種類型的文件中,那么你永遠不要使用忽略。 問題,您的數據是否格式良好? 如果是,請使用ignore。 如果沒有,請不要使用ignore。
列出所有獲取數據的方式? 1)有提取>>
而且還有??????
請為我列出
從標准復制粘貼,
basic_istream<charT,traits>& ignore(streamsize n = 1, int_type delim = traits::eof());
效果:表現為無格式輸入函數(如27.6.1.3第1段所述)。 構造一個崗位對象后,提取字符並丟棄它們。 提取字符,直到出現以下任何一種情況:
- 如果
n != numeric_limits<streamsize>::max()
(18.2.1),則提取n
字符- 文件結束發生在輸入序列上(在這種情況下,函數調用
setstate(eofbit)
,這可能會拋出ios_base::failure
(27.4.4.3));c == delim
為下一個可用輸入字符c
(在這種情況下提取c
)進行c == delim
。
你評論了與numeric_limits<>::max
是優越的,但看起來你不想使用你不完全理解的東西,這也很好。
除了ignore
之外,有人可能想要的唯一東西是非阻塞行為,即如果終端處於非緩沖模式,則不要等待用戶按下返回。 但據我所知,這完全不受iostream的支持。
你老師的回答有點不清楚(至少對我而言)。
關於ignore
,你的老師原則上是錯的: ignore
是如何清除流的標准習慣用法 (如Potatocorn所示,標准中甚至提到了這一點)。
但是,重要的是要注意cin.ignore(1000)
確實是一種不好的方法:這只是假設緩沖區中不會有超過1000個字符。 切勿使用在這樣一個神奇的數字ignore
。
相反,要么使用
cin.rdbuf()->in_avail()
(即讀緩沖區中可用的字符數) 1) ,或使用 numeric_limits<streamsize>::max()
。 1)不幸的是, in_avail
在最近的一些VC(?)編譯器上被破壞了,所以這種方法不是很方便。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.