Я использую этот код в 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 ответа
Такое поведение проявляется, когда параметр «Рассматривать wchar_t
как встроенный тип» (/Zc:wchar_t
) не указан.
Перейдите к свойствам проекта в разделе «Свойства конфигурации», «C / C ++», «Язык» и убедитесь, что для параметра «Обрабатывать WChar_t как встроенный тип» задано значение «Да».
Это связано с тем, что, когда для параметра установлено значение «Нет», wchar_t
становится typedef
для unsigned short
, что означает, что вы больше не можете его перегрузить. В результате выражение wcin >> userabort
вызвало operator>>
для unsigned short
, а не выражение для wchar_t
, что не дает правильного результата.
У меня нет объяснения, почему этот код будет работать в одной программе, а не работать в другой. Мне это кажется неправильным. Я думаю, вы неправильно понимаете, что делает wcin.clear();
. Я думаю, вы думаете, что это очищает любой ожидающий ввод из потока, но это не так. Способ сделать это - набить рот кода
wcin.ignore(std::numeric_limits<std::streamsize>::max());
Вам потребуется #include <limits>
, чтобы получить std::numeric_limits
.
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .