This question already has an answer here:
I am writing this code for a homework assignment (just starting C++ so please go easy). We've just started while, do-while, and for loops today. The program runs fine except that if you enter a letter when the program asks for an integer, it loops infinitely. What is going on? (Code below) ***EDIT: To clarify, the part that is looping is: "The number you have entered is negative. Please enter a positive number to continue." But the user is not given a chance to enter another number. It just keeps printing this.
#include <iostream>
using namespace std;
int main ( )
{
//define variables
int num1, num2, total;
char answer1;
do
{
//user enters a number
cout << "\nPlease enter a positive number and press Enter: \n";
cin >> num1;
//check that the given num1 value is positive
while (num1 < 0)
{
cout << "The number you entered is negative.\nPlease enter a positive number to continue.\n";
cin >> num1;
}
cout << endl;
//add the sum of 1 through num1 value
num2 = 1;
total = 0;
while (num1 >= num2)
{
total = total + num2;
num2 ++;
}
//tell the user the sum
cout << "The total of all the integers\nfrom 1 to " << num1 << " is: \n";
cout << total;
//ask if the user wants to try again
cout << "\n\nWould you like to try again with a new number?\nEnter y for yes or n for no.\n";
cin >> answer1;
} while (answer1 == 'y');
cout << endl;
return 0;
}
You can use a "char" datatype as an input from the user then use "static_cast("variable name");
This is how
basic_istream
works. In your case whencin >> num1
gets wrong input -failbit
is set andcin
is not cleared. So next time it will be the same wrong input. To handle this correctly you can add check for correct input and clear&ignorecin
in case of wrong input. For example:When you enter a letter, the error state of
cin
is set and there won't be any further input possible before you callcin.clear()
. In consequence, the statementcin >> num1
will not change the value ofnum1
and you loop forever.Try this:
EDIT:
Thanks to Lightness for pointing this out. You should initialize
num1
too:This answer should solve your problem. Basically you are trying to read a character from the stream and it can't be parsed to an int, so the stream is left in an error state.
You should check for an error, clear it and react accordingly.