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.)
Basically your
cinstream is in a fail state and thus returns immediately when you try to read it. Rewrite your example like this:cin >> nwill return a reference tocin, 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: