Почему std :: cin не запрашивает ввод пользователя? - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь лучше понять поведение std::cin.

Давайте посмотрим следующий код:

#include <iostream>                                                                                                                
int main()                                                                                                                         
{                                                                                                                                  
    char c, cin {'8'};                                                                                                             
    std::cin >> c; // enter '.'                                                                                                    
    std::cin.putback(c);                                                                                                           
    double d {88};                                                                                                                 
    std::cin >> d; // expected to fail.                                                                                            
    if (std::cin)                                                                                                                  
        std::cout << "double d = " << d << '\n';                                                                                   
    else                                                                                                                           
    {                                                                                                                              
        std::cin >> cin; // doesn't prompt user for entry neither put c into cin.                                                  
        std::cout << "cin = " << cin << '\n';                                                                                      
    }                                                                                                                              
    std::cout << "d = " << d << '\n'; // just to check.                                                                           
}

Интересно, что объясняет тот факт, что std::cin >> cin; не запрашивает ввод пользователя, и не приписывает значение c, которое было ранее возвращено в поток std::cin, переменной cin.

Примечание:

  • Известно, что std:: cin >> пропускает пробелы (пробел, новая строка, табуляция и т. Д.)

1 Ответ

0 голосов
/ 18 сентября 2018

Попробуйте добавить это

else                                                                                                                           
{   
    std::cin.clear(); // new                                                                                                                           
    std::cin >> cin;                                                  
    std::cout << "cin = " << cin << '\n';                                                                                      
}                                                                                                                              

Поскольку ваш предыдущий ввод был неудачным std::cin находится в состоянии ошибки, и все операции не будут выполнены, пока вы не очистите состояние ошибки.

...