Как работает cin, если пользователь случайно указал неверный тип данных? - PullRequest
3 голосов
/ 21 января 2020

Я новичок в C ++. Я экспериментировал с функционированием и ограничением cin.

Интересно, как cin будет принимать входные данные, если пользователь дает неправильные типы данных. Поэтому я проверил переполнение стека и получил этот ответ :

Когда вы читаете целое число и вводите 1,5, оно видит целое число 1 и останавливается в период, так как это не является частью целого числа. «.5» все еще на входе. Это причина того, что вы получаете только целую часть, а также причина, по которой он, похоже, не ожидает ввода во второй раз.

Чтобы обойти это, вы могли бы читать число вместо целое число, поэтому он читает все значение, или вы можете проверить, осталось ли что-нибудь еще в строке после чтения целого числа.

Так что я поэкспериментировал с ним.

#include <iostream>

int main()
{
    std::cout << "Enter 4 numbers: " <<
    std::endl;
    int v1 = 0, v3 = 0;
    float v2 = 0, v4 = 0;
    std::cin >> v1 >> v2 >> v3 >> v4;
    std::cout  << "-> " << v1 << " " << v2 << " " 
    << v3 << " " << v4 << std::endl;    
    return 0;
}
Enter 4 numbers:
3.14 2.718
-> 3 0.14 2 0.718

Работает как положено. Но когда я попытался

#include <iostream>

int main()
{
    std::cout << "Enter 3 numbers: " <<
    std::endl;
    int v1 = 0, v2 = 0;
    float v3 = 0;
    std::cin >> v1 >> v2 >> v3;
    std::cout << "-> " << v1 << " " << v2 << " " 
    << v3 << std::endl; 
    return 0;
}
Enter 3 numbers:
3.14
-> 3 0 0

, я ожидал 3 0 0.14, потому что 3 будет v1, так как int, 0.14 будет в буфере, поэтому, когда встретится 2 >> он назначит 0 на v2, а третий >> назначит 0.14 на v3, так как v3 - это тип float.

Пожалуйста, объясните идею, как это работает таким образом.

Я использовал компилятор G ++ mingw 8.2.0 на моем Lenovo Ideapad S340

Ответы [ 2 ]

5 голосов
/ 21 января 2020

Если извлечение завершается неудачно, в значение записывается ноль, и бит сбоя устанавливается.

Ввод: 3.14

Вы прочитали целое число. 3 читается, а .14 остается в буфере.

Вы читаете другое целое число. . не является частью целого числа, поэтому ничего не читается и failbit установлен.

Вы читаете число с плавающей точкой. Ничего не читается, потому что failbit уже установлен.

0 голосов
/ 21 января 2020

Когда std :: cin читает неправильный ввод, std :: cin переходит в состояние «сбой». Больше не может быть прочитано, а иногда состояние отказа приводит к ошибкам или спаму текста на терминал. Для выхода из состояния сбоя вы можете использовать функцию std :: cin.clear (). Кроме того, когда вы используете std :: cin.clear (), я также рекомендую использовать std :: cin.ignore (10000, '\ n') для очистки cin и предотвращения дальнейших сбоев.

...