Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

infinite loop in c++ [duplicate]

I'm learning C++ and writing little programs as I go along. The following is one such program:

// This program is intended to take any integer and convert to the
// corresponding signed char.

#include <iostream>

int main()
{
  signed char sch = 0;
  int n = 0;
  while(true){
    std::cin >> n;
    sch = n;
    std::cout << n << " --> " << sch << std::endl;
  }
}

When I run this program and keep inputs at reasonably small absolute values, it behaves as expected. But when I enter larger inputs, e.g., 10000000000, the program repetitively spits out the same output. Some combinations of input cause erratic behavior. For example:

#: ./int2ch
10
10 --> 

10000000000
10 -->

10 -->

10 -->

10 -->

The program spits out "10 --> " until it's killed. (With this particular sequence of inputs, the program's output changes speed erratically.) I also noticed that the output of large values is determined by the previous legal input as well as the value of the current illegal input.

What's going on? (I don't care about fixing the program, that's easy. I want to understand it.)

like image 502
108 Avatar asked Nov 05 '08 21:11

108


People also ask

How many times will an infinite loop repeat?

As we already know that non-zero integer represents the true condition, so this loop will run infinite times.

How do you make an infinite loop loop?

The infinite loop We can create an infinite loop using while statement. If the condition of while loop is always True , we get an infinite loop.

What is an infinite loop explain with an example in C?

An infinite loop occurs when a condition always evaluates to true and because of this the loop control doesn't go outside of that loop. Example: i = -1. while(i != 0): print(1)


2 Answers

Basically your cin stream is in a fail state and thus returns immediately when you try to read it. Rewrite your example like this:

#include <iostream>

int main()
{
  signed char sch = 0;
  int n = 0;
  while(std::cin >> n){
    sch = n;
    std::cout << n << " --> " << sch << std::endl;
  }
}

cin >> n will return a reference to cin, which you can test for "good-ness" in a conditional. So basically the the "while(std::cin >> n)" is saying "while i could still read from standard input successfully, do the following"

EDIT: the reason it repeatedly output the last good value entered is because that was the last value successfully read in n, the failed reads won't change the value of n

EDIT: as noted in a comment, you can clear the error state and try again something like this would probably work and just ignore bad numbers:

#include <iostream>
#include <climits>

int main() {
    signed char sch = 0;
    int n = 0;
    while(true) {
        if(std::cin >> n) {
            sch = n;
            std::cout << n << " --> " << sch << std::endl;
        } else {
            std::cin.clear(); // clear error state
            std::cin.ignore(INT_MAX, '\n'); // ignore this line we couldn't read it
        }
    }
}
like image 147
Evan Teran Avatar answered Sep 17 '22 18:09

Evan Teran


Yes, Evan Teran pointed out most things already. One thing i want to add (since i cannot comment his comment yet :)) is that you must put the call to istream::clear before the call to istream::ignore. The reason is that istream::ignore likewise will just refuse to do anything if the stream is still in the fail state.

like image 40
Johannes Schaub - litb Avatar answered Sep 19 '22 18:09

Johannes Schaub - litb