944,044 Members | Top Members by Rank

Ad:
  • C++ Discussion Thread
  • Unsolved
  • Views: 7651
  • C++ RSS
Sep 27th, 2004
0

infinite loop...

Expand Post »
i dunno whether this question has been ask before but i've try to search but didn't found. so i ask it here...

very simple... if i declare

int Z;
cin >> Z;


if I enter integer, it works fine but i enter character it's looping.
how to prevent it from looping when character was entered?
Similar Threads
Reputation Points: 10
Solved Threads: 0
Newbie Poster
lara_ is offline Offline
17 posts
since Jul 2004
Sep 27th, 2004
0

Re: infinite loop...

It looks as if you are automatically assuming that Z is an integer, and then doing some math calculations with it. When it's not an integer, but it's treated as one, you could end up in some sorta loop further down in your program. It looks as if your best option here is to determine whether Z is an integer, and if it isn't, prompt the user again to re-enter a number. You might also try doing
C++ Syntax (Toggle Plain Text)
  1. z=(int)(z);
to force z to be treated as an integer.

Regardless ... there might be a built-in function (I'm not exactly sure) that determines whether a value isInt() but if not, you will need to write one yourself. You would look at the ASCII equivalent of the value and see if it is an integer range or a character range. I'm not exactly positive how this would be done or if there is a simpler way (basically because I don't have an ASCII chart handy right now.) Perhaps someone else can offer more assistance than I.
Administrator
Staff Writer
Reputation Points: 1422
Solved Threads: 162
The Queen of DaniWeb
cscgal is online now Online
13,646 posts
since Feb 2002
Sep 28th, 2004
0

Re: infinite loop...

Quote originally posted by lara_ ...
i dunno whether this question has been ask before but i've try to search but didn't found. so i ask it here...

very simple... if i declare

int Z;
cin >> Z;


if I enter integer, it works fine but i enter character it's looping.
If you enter characters that are not part of an int, then the input will fail. But the offending character(s) will be left in the input stream.
Quote originally posted by lara_ ...
how to prevent it from looping when character was entered?
Read user input as a string. Then attempt to convert the test to an integer. If it fails, try again.
Team Colleague
Reputation Points: 2780
Solved Threads: 312
long time no c
Dave Sinkula is offline Offline
4,790 posts
since Apr 2004
Sep 28th, 2004
0

Re: infinite loop...

As a side note, if you think your program has an infinite loop, use the compiler's optimizer switches. That way the infinite loop will run 2-4 times faster!
Reputation Points: 36
Solved Threads: 11
Posting Pro in Training
Chainsaw is offline Offline
436 posts
since Jun 2004
Sep 29th, 2004
1

Re: infinite loop...

>It looks as if you are automatically assuming that Z is an integer
That's a reasonable assumption seeing as how Z was declared as int.

>When it's not an integer, but it's treated as one, you could end up in some sorta loop further down in your program.
The problem is with cin. The >> operator of cin will figure out what type the object is and convert the data from the standard input stream to that type. If there's no conversion then cin will leave the unconverted data in the stream and enter a failure state. This is a common problem with loops like this:
C++ Syntax (Toggle Plain Text)
  1. int number;
  2.  
  3. while ( cin>> number )
  4. cout<< number <<endl;
If a letter is entered, this will be an infinite loop because cin will continue to fail on the invalid data in the stream. The solution is to remove the offending input and clear the stream or read all data as a string and parse it for error handling. The latter is easy and the former can be done (rather naively) like this:
C++ Syntax (Toggle Plain Text)
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. bool get_number ( int& number )
  6. {
  7. while ( !( cin>> number ) ) {
  8. if ( cin.eof() )
  9. return false;
  10. else {
  11. char ch;
  12.  
  13. cin.clear();
  14.  
  15. cout<<"Invalid input, please try again: ";
  16. while ( cin.get ( ch ) && ch != '\n' )
  17. ;
  18. }
  19. }
  20.  
  21. return true;
  22. }
  23.  
  24. int main()
  25. {
  26. int number;
  27.  
  28. while ( get_number ( number ) )
  29. cout<< number <<endl;
  30. }
>to force z to be treated as an integer.
It's too late at that point. The issue isn't with Z being treated as an integer, but with cin's >> operator returning a failure status.

>there might be a built-in function (I'm not exactly sure) that determines whether a value isInt()
Provided the value is a string, you can try to convert it to an integer with atoi (yuck) or strtol (better). If the conversion succeeds then it's an integer, otherwise not. But this is a moot point if you're trying to read and convert input with the same function call, such as scanf or cin's >> operator.

>You would look at the ASCII equivalent of the value and see if it is an integer range or a character range.
Or just use
C++ Syntax (Toggle Plain Text)
  1. if ( Z >= '0' && Z <= '9' )
Since the standard requires digits to have adjacent values regardless of the character set. Or better yet, include <cctype> and say
C++ Syntax (Toggle Plain Text)
  1. if ( std::isdigit ( Z ) )
But that only handles one character. For numbers longer than a single digit you need a loop. Once again, the point is moot because cin will try to convert the input to an integer before you can get your hands on it. By then the damage has presumably already been done.

>That way the infinite loop will run 2-4 times faster!
Kind of like trying to optimize your idle system process, no?
Administrator
Reputation Points: 6442
Solved Threads: 1393
Bad Cop
Narue is offline Offline
11,807 posts
since Sep 2004
Jul 2nd, 2005
0

Re: infinite loop...

I know this thread is really old, but I just can't help commenting on the infinite loop optimization joke That was funny!
Reputation Points: 17
Solved Threads: 5
Posting Whiz in Training
mmiikkee12 is offline Offline
274 posts
since Oct 2004
Feb 3rd, 2011
-3
Re: infinite loop...
Click to Expand / Collapse  Quote originally posted by lara_ ...
i dunno whether this question has been ask before but i've try to search but didn't found. so i ask it here...

very simple... if i declare

int Z;
cin >> Z;


if I enter integer, it works fine but i enter character it's looping.
how to prevent it from looping when character was entered?
Here is some solution Z = static_cast<int>(Z);
static cast changes parametres (Z) type into type declared inside <int>
I dont know if this is best sollution, place it before cin>>
Last edited by Hymppis; Feb 3rd, 2011 at 7:38 am.
Reputation Points: 9
Solved Threads: 0
Newbie Poster
Hymppis is offline Offline
1 posts
since Feb 2011

This thread is more than three months old

No one has posted to this discussion for at least three months. Please let old threads die and do not reply to them unless you feel you have something new and valuable to contribute that absolutely must be added to make the discussion complete. Otherwise, please start a new thread in this forum instead.
Message:
Previous Thread in C++ Forum Timeline: help writing pseudocode
Next Thread in C++ Forum Timeline: SQL Simulation in C++ project..





About Us | Contact Us | Advertise | Acceptable Use Policy
Forum Index | Build Custom RSS Feed


Follow us on Twitter


© 2011 DaniWeb® LLC