Почему Ctrl + Z недействителен после Enter (\ n) в cin.ignore (INT_MAX, '\ n')? (проверка ввода) - PullRequest
0 голосов
/ 04 мая 2020

Я хочу проверить ввод с клавиатуры double:

  1. , если ввод - double, программа должна продолжаться нормально.
  2. если ввод не является double (включая Ctrl+Z), программа должна очистить состояние потока и игнорировать весь оставшийся ввод до следующего \n, чтобы получить новый ввод.

Итак, я написал этот код:

#include "std_lib_facilities.h"

int main()
{
    double val{};

    cout << "Please enter a 'double' value:\n";

    while (!(cin>>val))
    {   
        cout << "ERROR: That is not a valid entry. Please try again\n";
        cin.clear();
        cin.ignore(INT_MAX, '\n');
    }

    cout << val << "\n\n";

    keep_window_open();
    return 0;
}

И у меня есть 2 вопроса: (Я хочу решить эту проблему, используя только cin и cout, пожалуйста.)

  1. Когда пользователь вводит Ctrl + Z и нажимает Enter (что совпадает с '\n'), cin.ignore(INT_MAX, '\n'); продолжает ждать ввода '\n'. Почему это происходит, если после Ctrl + Z уже стоит Enter (или \n)?

  2. Этот код не распространяется на такие записи, как: 98ssssssssss. Примет значение 98, и sssssssss останется в потоке. Как улучшить код, чтобы он распознал его как неправильную запись?

1 Ответ

0 голосов
/ 04 мая 2020

Ctrl + Z зависит от машины / платформы, на которой вы работаете (например, на некоторых машинах это Ctrl + D, если я не ошибаюсь). В общем, '\ n' - это не совсем то же самое, что и так называемый «конец строки» для входных данных. Даже '\ n' в конце вашего оператора cout лучше заменить оператором <<endl;, потому что вывод может быть по какой-то причине кэширован, а не распечатан сразу. Как заявил Джон, лучше получить ввод в виде строки, а затем проделать с ней все необходимые манипуляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...