I figured I could use scanf more safely if I checked its ...
I figured I could use scanf more safely if I checked its return value to make sure that the user typed the numeric values I expect:
printf("enter a number: ");
if(scanf("%d", &n) == 1)
printf("try again: ");
printf("you typed %d\n", n);
but sometimes it seems to go into an infinite loop. Why?
When scanf is attempting to convert numbers, any non-numeric characters it encounters terminate the conversion and are left on the input stream. Therefore, unless some other steps are taken, unexpected non-numeric input ``jams'' scanf again and again: scanf never gets past the bad character(s) to encounter later, valid data. If the user types a character like `x' in response to the code above, the code will loop printing ``try again'' forever, but it won't give the user a chance to try.
You may be wondering why scanf leaves unmatchable characters on the input stream. Suppose you had a compact data file containing lines consisting of a number and an alphabetic code string, without intervening whitespace, like
You might want to parse this data file with scanf, using the format string "%d%s". But if the %d conversion did not leave the unmatched character on the input stream, %s would incorrectly read "ODE" instead of "CODE". (The problem is a standard one in lexical analysis: when scanning an arbitrary-length numeric constant or alphanumeric identifier, you never know where it ends until you've read ``too far.'' This is one reason that ungetc exists.)
2015-10-19, 694👍, 0💬
What Is C Language? The C programming language is a standardized programming language developed in t...
What is effort variance? Effort Variance = (Actual effort – Estimated Effort) / Estimated Effort.
Write down the equivalent pointer expression for referring the same element a[i][j][k][l]? a[i] == *...
How To Decrement Dates by 1? - MySQL FAQs - Introduction to SQL Date and Time Handling If you have a...
What is the purpose of Replication ? Replication is way of keeping data synchronized in multiple dat...