2012-09-03 24 views
0

我有一些代碼,基本上看起來像這樣計數標準輸入的字符數的CIN執行後

int a; 
cin>>a; 

if(!cin.good()) 
{ 
    std::cin.clear(); 
    std::cin.ignore(2); 

    // set some default value for 'a' and display some messages 
} 

如果我給一個整數(如預期),或者如果我嘗試這工作正常把它弄混一點,放棄2個字符。例如。 'ss',但是如果我給出一個3個字符的輸入'sss',最後的''不會被忽略,並且被接受爲我在我的程序中的更多cin的輸入。

在第一個cin發生後,有什麼方法可以計算標準輸入(緩衝區?)中的字符數,因此我可以放心地忽略所有這些字符。

+0

嘗試'cin.gcount()'後的第一提取。 –

+1

'gcount()'僅爲未格式化的輸入函數設置。 –

回答

2

你的意思很不明確,但一個意思可能是你想忽略當前行上的所有字符。你不需要知道的字符數可以這樣做:

std::cin.ignore(std::numeric_limits<std::size_type>::max(), '\n'); 

上面的語句會忽略所有的字符,直到它已提取的換行符。

3

這是如何工作的?它應該忽略輸入緩衝區中可用的所有內容,以防止第三個s被稍後使用。它使用std::basic_streambuf::in_avail

std::cin.ignore(std::cin.rdbuf()->in_avail()); 

如果無法正常工作,您可以嘗試忽略,直到達到換行。

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
+0

'std :: streambuf :: in_avail()'不會給你任何有趣的信息,除了回答誰可以提取很多字符的問題之外,至少在沒有阻塞的情況下。例如,對於一個非常長的輸入,它可以給出關於部分行的信息,即適合'std :: cin'內部緩衝區的字符數量。第二種方法是要走的路。 –

0

做一些谷歌搜索我發現這篇文章在how to cope with extraneous characters in cin

顯然,直接在std::cin上使用>>並不是一個好習慣。這樣使用它,

int a; 
std::string line; 
std::getline(cin, line); 
std::stringstream ss(line); 

if (ss >> a) 
    // Success 

// Failure: input does not contain a valid number 

由於我們使用std::getline()每次讀書,直到\n,多餘的字符也從std::cin提取並投入line

Code source