Infinite Loop

Oct 14, 2014 at 4:42pm
Hi. I'm having a problem with this code. If I enter an integer value, it works just fine. However, if I type in a non-integer value, it keeps printing out the error message rather than going back to the user input. It's stuck in an infinite loop.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int error;
int goalCalorie;

do
{
  error = 0;
  cin >> goalCalorie;
  cin.ignore(100,'\n');

  if (goalCalorie > 0 && goalCalorie < 10000)
  {
    cout << "Your calorie goal has been set to: " << goalCalorie << endl;
  }
  else
  {
    cout << "Please enter a valid number: ";
    ++error;
  }
} while (error > 0);
Last edited on Oct 14, 2014 at 5:06pm
Oct 14, 2014 at 5:18pm
I had a go at this, and didn't get the same results as you. Perhaps your system does IO in an unexpected way?

Here's are 2 sample sessions, I've re-posted the code afterwards, just so you can be sure it's the same code.

$ ./a.out 
2
Your calorie goal has been set to: 2
$ ./a.out 
-2
Please enter a valid number: -4
Please enter a valid number: 4
Your calorie goal has been set to: 4
$ 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>

using namespace std;

int main()
{
	int error;
	int goalCalorie;

	do
	{
	  error = 0;
	  cin >> goalCalorie;
	  cin.ignore(100,'\n');

	  if (goalCalorie > 0 && goalCalorie < 10000)
	  {
	    cout << "Your calorie goal has been set to: " << goalCalorie << endl;
	  }
	  else
	  {
	    cout << "Please enter a valid number: ";
	    ++error;
	  }
	} while (error > 0);
}


Oct 14, 2014 at 5:47pm
The loop will be infinite if you enter a bad value at the start, because error will always be greater than 0... so if you enter a bad value error is incremented and will "always" be greater than 0.
I would suggest using a flag controlled while loop
where the flag is set to true and changed to false if the user enters a good value.
Oct 14, 2014 at 5:48pm
I get those same results. My problem is if the user somehow enters in for example... "Two" instead of "2". I would like to prevent the end user from entering a non-digit value. With my current code, if you enter a non-digit value, it goes into an infinite loop.
Oct 14, 2014 at 5:58pm
Ummm idk... i guess since the program trys to store a string inside an interger type it malfunctions, maybe if you add an if statement to check if the value entered is not of type int then do somthing
Oct 14, 2014 at 6:00pm
Oct 14, 2014 at 6:21pm
Check this link:

http://stackoverflow.com/questions/12272277/program-not-waiting-for-cin

It has to do with inputting a char when an int is expected.
Oct 14, 2014 at 11:28pm
You guys are both right.
I put the cin in the condition and tested it to a true/false value. (Per coltehrman.)
It still went into an infinite loop, but cin has to be emptied or it gets bypassed. (Per PCrumley48.)
After that, it worked perfectly.

Thank you guys for the help!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>

using namespace std;

int main()
{
  int goalCalorie;

  while (!(cin >> goalCalorie))
  {
      cout << "Please enter a valid number: ";
      cin.clear();
      cin.ignore(100,'\n');
  }
  cout << "Your calorie goal has been set to: " << goalCalorie << endl;
}
Last edited on Oct 14, 2014 at 11:31pm
Oct 16, 2014 at 6:01pm
You originally intended to reject entries less than zero or greater than 10000, right?

That no longer works. It only rejects values greater or less than the valid range for int.

A couple of lines more will do the trick.
Topic archived. No new replies allowed.