Suds2
Suds2

Reputation: 261

How to make the user enter a positive double variable?

I want the user to enter a positive double variable. If they enter anything else, I want the program to loop and continue to ask them to enter a number instead of getting an error and closing. I made an infinite loop with a conditional statement and a break. For some reason if they enter something other than a positive number it infinitely asks for the the radius. Can someone help me with this?

for(;;) {
    cout << "Radius: ";
    cin >> radius;
    if(radius > 0){
        break;
    }
}

Upvotes: 0

Views: 1615

Answers (2)

πάντα ῥεῖ
πάντα ῥεῖ

Reputation: 1

You can simply check the stream state of cin:

    double radius;
    for(;;) {
        cout<<"Radius: ";
        if(!(cin>>radius) || radius < 0.0) {
             cout << "Invalid input, please enter a positive double value." << endl;
             cin.clear();
             std::string dummy;
             cin >> dummy; // Read the left invalid input
        }
        else {
           break;
        }
    }

Upvotes: 3

vsoftco
vsoftco

Reputation: 56567

You need to clear the stream's error flags, otherwise you keep looping, since no more other reads are performed when the stream is in a bad state, and radius keeps its value before the loop. You need to do the following (must #include <limits>):

if(!(cin >> radius)) // we didn't read a number, cin has a "bad" state
{
    cin.clear(); // clear the error flags
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); // ignore the rest
    continue;
}

Upvotes: 2

Related Questions