2011-08-26 52 views
2

我使用此代碼在MSVC++ 2010實現用戶輸入迴路:使用std :: WCIN讀wchar_t的總是給人LF(10,是0xA)

int wmain(int argc, wchar_t* argv[]) 
{ 
    vector<wstring> arguments; 
    wstring userinput; 
    wchar_t userabort; 
    do 
    { 
     wcout << L"Please type param #" << argc++ << L":" << endl; 
     wcin >> userinput; 
     arguments.push_back(userinput); 
     userinput.clear(); 
     wcout << L"Type 'y' to input next param, 'n' to start program:" << endl; 
     wcin >> userabort; 
     wcout << L"Userabort: " << userabort << " (" << int(userabort) << ")" << endl; 
    } 
    while (userabort == L'y' || userabort == L'Y' 
     || userabort == L'j' || userabort == L'J'); 
    return 1; 
} 

在我的項目,這個作品之一完美無瑕(在Debug和Release配置中)。在我的另一個項目中,這個非常相同的代碼(也僅限於wmain中的代碼)表現得很奇怪(在兩種配置中都是如此):在「輸入'y'輸入下一個參數」之後它不會停止等待我的輸入,但而是立即從流中讀取換行字符。

我甚至試過wcin >> skipws >> userabort;但結果相同。我不知道可能會導致什麼。它可能是一些編譯器設置或導入文件的結果嗎?或者,也許是因爲按返回發送userinput wstring到程序?任何幫助讚賞。

回答

3

當未指定「作爲內置類型對待wchar_t」(/Zc:wchar_t)選項時,會出現此行爲。

轉到項目的屬性,在配置屬性,C/C++語言下,並確保「將WChar_t作爲內置類型」設置爲yes。

這是因爲當選項設置爲no時,wchar_t對於unsigned short變成typedef,這意味着您不能再對其重載。因此,表達式wcin >> userabortunsigned short調用了operator>>,而不是wchar_t的調用10,這不會給出正確的結果。

+0

修正了它,非常感謝。你知道爲什麼嗎? –

+0

@Felix我想我明白了。它與如何在'operator >>'完成重載解析有關。我在答案中添加了信息。 – Sven

0

我沒有解釋爲什麼這個代碼可以在一個程序中工作,但在另一個程序中失敗。我看起來不對。我想你是誤解wcin.clear();做什麼。我猜你認爲清除了任何來自流的未決輸入,但它沒有。做到這一點的方法是這樣拗口的代碼

wcin.ignore(std::numeric_limits<std::streamsize>::max()); 

您將需要#include <limits>得到std::numeric_limits

+0

我加了'clear()'來查看這個錯誤,只是爲了測試。它在一個項目中沒有它,也沒有在另一個項目中工作。我現在從我的代碼中刪除它,使它更具可讀性,因爲它確實沒有什麼區別。對不起,它讓你的評論有點不符合上下文。謝謝你的回答,我會研究輸入流中clear()的含義。 –

相關問題