Сообщение Failcheck повторяется для того же количества недопустимых символов, содержащихся в wcin - PullRequest
0 голосов
/ 20 ноября 2018

Я сейчас возвращаюсь к программированию и начал с простого калькулятора уравнений второй степени.Я получаю неожиданное поведение, которое я понятия не имею, почему происходит.У меня есть время, которое проверяет, являются ли значения a, b и c числовыми, с сообщением об ошибке, если это не так.Но сообщение об ошибке повторяется для того же количества недопустимых символов внутри недопустимого ввода.

Вот код:

wcout << "Insert a value for a: \n";
wcin >> a;
while (wcin.fail())
{
    wcin.clear();
    wcin.ignore();
    wcout << L"Please insert a numerical value.\n";
    wcin >> a;
}

Пример описанной проблемы .Если кто-то знает, что происходит, я был бы признателен за помощь

РЕДАКТИРОВАТЬ: я использую wcout и wcin из-за символов Юникода, таких как буквы с акцентом и греческие символы.Я не знаю, может ли эта проблема быть связана с этим, но часто я получаю сообщение об ошибке "wcin / wcout is Двусмысленное"

1 Ответ

0 голосов
/ 20 ноября 2018

Хотя wcin.clear() только устанавливает флаги состояния ошибки потока, входной поток должен быть сброшен, например, wcin.ignore(...)

Если вы используете wcin.ignore(), он будет использовать параметры по умолчанию (см. здесь ): один символ или конец файла условие.

При вводе «aaa» извлекается только «a», остальные остаются на входе, который будет-проверено снова в следующем цикле while.

При вводе с консоли обычно используется клавиша «Ввод», символ которой '\n'.Это разделитель, который мы должны использовать для сброса ввода:

wcin.ignore(100, '\n');

Обратите внимание, что я написал 100.Если вы хотите отбросить любое количество символов, вам нужно:

#include <limits>
....

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