The scanf Function
Just as printf prints output in a specified format, scanf reads input according to a particular format. A scanf format string, like a printf format string, may contain both ordinary characters and conversion specifications. The conversions allowed with scanf are essentially the same as those used with printf.
In many cases, a scanf format string will contain only conversion specifications, as in the following example:
int i j ; float x, y;
scanf(“%d%d%f%f”, &i, &j, &x, &y); Suppose that the user enters the following input line: 1 -20 .3 -4.0e3
scanf will read the line, converting its characters to the numbers they represent, and then assign 1, -20, 0.3, and -4000.0 to i, j. x, and y, respectively. “Tightly packed” format strings like “ %d%d%f %f” are common in scanf calls, printf format strings are less likely to have adjacent conversion specifications.
scanf, like printf, contains several traps for the unwary. When using scanf. the programmer must check that the number of conversion specifications matches the number of input variables and that each conversion is appropriate for the corresponding variable >as with printf, the compiler isn't required to check for a possible mismatch. Another trap involves the & symbol, which normally precedes each variable in a scanf call. The & is usually (but not always) required, and it's the programmer's responsibility to remember to use it.
Calling scanf is a powerful but unforgiving way to read data. Many professional C programmers avoid scanf, instead reading all data in character form and converting it to numeric form later. We'll use scanf quite a bit. especially in the early beginiers because it provides a simple way to read numbers. Be aware, however, that many of our programs won't behave properly if the user enters unexpected input. As we'll see later, it's possible to have a program test whether scanf successfully read the requested data (and attempt to recover if it didn't). Such tests are impractical for the programs in this book >they would add too many statements and obscure the point of the examples.
How scanf Works
scanf can actually do much more than I've indicated so far. It is essentially a “pattern-matching” function that tries to match up groups of input characters with conversion specifications.
Like the printf function, scanf is controlled by the format string. When it is called, scanf begins processing the information in the string, starting at the left. For each conversion specification in the format string, scanf tries to locate an item of the appropriate type in the input data, skipping blank space if necessary, scanf then reads the item, stopping when it encounters a character that can't possibly belong to the item. If the item was read successfully, scanf continues processing the rest of the format string. If any item is not read successfully, scanf returns immediately without looking at the rest of the format string (or the remaining input data).
As it searches for the beginning of a number, scanf ignores white-space characters (the space, horizontal and vertical tab. form-feed, and new-line characters). As a result, numbers can be put on a single line or spread out over several lines.