Я использую этот код в MSVC ++ 2010 для реализации цикла пользовательского ввода:

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;
}

В одном из моих проектов это работает безупречно (как в конфигурации отладки, так и в конфигурации выпуска). В другом из моих проектов тот же самый код (также как и только код в wmain) ведет себя странно (также в обеих конфигурациях): он не перестает ждать моего ввода после «Введите 'y', чтобы ввести следующий param ", но вместо этого немедленно считывает символ перевода строки из потока.

Я даже попробовал wcin >> skipws >> userabort;, но результат тот же. Я не знаю, что вообще могло вызвать это. Может быть, это результат какой-то настройки компилятора или импортированного файла? Или это может быть результатом нажатия return для отправки wstring userinput программе? Любая помощь приветствуется.

2
Felix Dombek 26 Авг 2011 в 17:41

2 ответа

Лучший ответ

Такое поведение проявляется, когда параметр «Рассматривать wchar_t как встроенный тип» (/Zc:wchar_t) не указан.

Перейдите к свойствам проекта в разделе «Свойства конфигурации», «C / C ++», «Язык» и убедитесь, что для параметра «Обрабатывать WChar_t как встроенный тип» задано значение «Да».

Это связано с тем, что, когда для параметра установлено значение «Нет», wchar_t становится typedef для unsigned short, что означает, что вы больше не можете его перегрузить. В результате выражение wcin >> userabort вызвало operator>> для unsigned short, а не выражение для wchar_t, что не дает правильного результата.

3
Sven 26 Авг 2011 в 14:05

У меня нет объяснения, почему этот код будет работать в одной программе, а не работать в другой. Мне это кажется неправильным. Я думаю, вы неправильно понимаете, что делает wcin.clear();. Я думаю, вы думаете, что это очищает любой ожидающий ввод из потока, но это не так. Способ сделать это - набить рот кода

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

Вам потребуется #include <limits>, чтобы получить std::numeric_limits.

0
john 26 Авг 2011 в 13:52