User Name Password Register
DaniWeb IT Discussion Community
All
What is DaniWeb IT Discussion Community?
You're currently browsing the C++ section within the Software Development category of DaniWeb, a massive community of 401,997 software developers, web developers, Internet marketers, and tech gurus who are all enthusiastic about making contacts, networking, and learning from each other. In fact, there are 2,535 IT professionals currently interacting right now! Registration is free, only takes a minute and lets you enjoy all of the interactive features of the site.
Views: 3923 | Replies: 5
Reply
Join Date: Jul 2004
Posts: 10
Reputation: lara_ is an unknown quantity at this point 
Rep Power: 5
Solved Threads: 0
lara_'s Avatar
lara_ lara_ is offline Offline
Newbie Poster

Help infinite loop...

  #1  
Sep 27th, 2004
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?
AddThis Social Bookmark Button
Reply With Quote  
Join Date: Feb 2002
Location: Lawn Guylen, NY
Posts: 10,889
Reputation: cscgal is just really nice cscgal is just really nice cscgal is just really nice cscgal is just really nice cscgal is just really nice 
Rep Power: 32
Solved Threads: 109
Admin
Staff Writer
cscgal's Avatar
cscgal cscgal is online now Online
The Queen of DaniWeb

Re: infinite loop...

  #2  
Sep 27th, 2004
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
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.
Reply With Quote  
Join Date: Apr 2004
Posts: 3,473
Reputation: Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light 
Rep Power: 16
Solved Threads: 138
Colleague
Dave Sinkula's Avatar
Dave Sinkula Dave Sinkula is offline Offline
long time no c

Re: infinite loop...

  #3  
Sep 28th, 2004
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.
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.
Reply With Quote  
Join Date: Jun 2004
Location: Marin, CA, USA
Posts: 434
Reputation: Chainsaw is an unknown quantity at this point 
Rep Power: 5
Solved Threads: 9
Chainsaw's Avatar
Chainsaw Chainsaw is offline Offline
Unprevaricator

Re: infinite loop...

  #4  
Sep 28th, 2004
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!
Reply With Quote  
Join Date: Sep 2004
Posts: 6,065
Reputation: Narue has much to be proud of Narue has much to be proud of Narue has much to be proud of Narue has much to be proud of Narue has much to be proud of Narue has much to be proud of Narue has much to be proud of Narue has much to be proud of 
Rep Power: 26
Solved Threads: 419
Super Moderator
Narue's Avatar
Narue Narue is offline Offline
Expert Meanie

Re: infinite loop...

  #5  
Sep 29th, 2004
>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:
int number;

while ( cin>> number )
  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:
#include <iostream>

using namespace std;

bool get_number ( int& number )
{
  while ( !( cin>> number ) ) {
    if ( cin.eof() )
      return false;
    else {
      char ch;

      cin.clear();

      cout<<"Invalid input, please try again: ";
      while ( cin.get ( ch ) && ch != '\n' )
        ;
    }
  }

  return true;
}

int main()
{
  int number;

  while ( get_number ( number ) )
    cout<< number <<endl;
}
>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
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
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?
Reply With Quote  
Join Date: Oct 2004
Location: On Earth, I think...
Posts: 246
Reputation: mmiikkee12 is an unknown quantity at this point 
Rep Power: 4
Solved Threads: 4
mmiikkee12's Avatar
mmiikkee12 mmiikkee12 is offline Offline
Posting Whiz in Training

Re: infinite loop...

  #6  
Jul 2nd, 2005
I know this thread is really old, but I just can't help commenting on the infinite loop optimization joke That was funny!
Reply With Quote  
Reply

Only community members can participate in forum threads. You must register or log in to contribute.

DaniWeb C++ Marketplace
Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)

 

Thread Tools Display Modes

Similar Threads
Other Threads in the C++ Forum

All times are GMT -4. The time now is 8:48 pm.
Forum system based on vBulletin Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
©2003 - 2008 DaniWeb® LLC