Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does this program go in endless loop?

Tags:

c++

I have such a program:

#include <stdlib.h>
#include <iostream>

static int pswd=0;

int main() {

    do {
        std::cout<<"I need your password:"<<std::endl;          
        std::cin>>pswd;
    } while (pswd!=3855);

    std::cout<<"Congratulations! Your password is correct! Your soul is free again!"<<std::endl;
}

And I have, may be, a stupid question. When I enter invalid values (with non-numerical symbols or values greater then int) program goes in endless loop without reading of any information from console.

I need your password:
I need your password:
I need your password:
I need your password:
I need your password:
I need your password:
I need your password:
I need your password:
I need your password:
I need your password:
I need your password:
I need your password:
I need your password:
I need your password:
I need your password:
I need your password:
I need your password:
I need your password:
I need your password:
I need your password:
I need your password:
I need your password:
I need your password:
I need your password:
        ...

Why does this program go in endless loop?

like image 750
Lucky Man Avatar asked Mar 22 '12 11:03

Lucky Man


2 Answers

Because after invalid input, the stream is in failed state and all further input operations are no-op. You always have to check the result of the input operation.

do {
    std::cout<<"I need your password:"<<std::endl;          
    if (!(std::cin >> pswd)) {
        // clear error flags
        std::cin.clear();
        // discard erroneous input (include <limits>)
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
} while (pswd!=3855);
like image 158
Cat Plus Plus Avatar answered Oct 06 '22 01:10

Cat Plus Plus


It is trying to read an int but it can take a peek into the buffer from STDIN. It notices that you have not got an int so the cin>> fails. (See fail bit).

So it just goes around again. You need to check for failed type conversion.

like image 42
Ed Heal Avatar answered Oct 06 '22 00:10

Ed Heal