(libc.info.gz) Formatted Input Basics
Info Catalog
(libc.info.gz) Formatted Input
(libc.info.gz) Input Conversion Syntax
12.14.1 Formatted Input Basics
------------------------------
Calls to 'scanf' are superficially similar to calls to 'printf' in that
arbitrary arguments are read under the control of a template string.
While the syntax of the conversion specifications in the template is
very similar to that for 'printf', the interpretation of the template is
oriented more towards free-format input and simple pattern matching,
rather than fixed-field formatting. For example, most 'scanf'
conversions skip over any amount of "white space" (including spaces,
tabs, and newlines) in the input file, and there is no concept of
precision for the numeric input conversions as there is for the
corresponding output conversions. Ordinarily, non-whitespace characters
in the template are expected to match characters in the input stream
exactly, but a matching failure is distinct from an input error on the
stream.
Another area of difference between 'scanf' and 'printf' is that you
must remember to supply pointers rather than immediate values as the
optional arguments to 'scanf'; the values that are read are stored in
the objects that the pointers point to. Even experienced programmers
tend to forget this occasionally, so if your program is getting strange
errors that seem to be related to 'scanf', you might want to
double-check this.
When a "matching failure" occurs, 'scanf' returns immediately,
leaving the first non-matching character as the next character to be
read from the stream. The normal return value from 'scanf' is the
number of values that were assigned, so you can use this to determine if
a matching error happened before all the expected values were read.
The 'scanf' function is typically used for things like reading in the
contents of tables. For example, here is a function that uses 'scanf'
to initialize an array of 'double':
void
readarray (double *array, int n)
{
int i;
for (i=0; i<n; i++)
if (scanf (" %lf", &(array[i])) != 1)
invalid_input_error ();
}
The formatted input functions are not used as frequently as the
formatted output functions. Partly, this is because it takes some care
to use them properly. Another reason is that it is difficult to recover
from a matching error.
If you are trying to read input that doesn't match a single, fixed
pattern, you may be better off using a tool such as Flex to generate a
lexical scanner, or Bison to generate a parser, rather than using
'scanf'. For more information about these tools, see
(flex.info)Top, and (bison.info)Top.
Info Catalog
(libc.info.gz) Formatted Input
(libc.info.gz) Input Conversion Syntax
automatically generated by
info2html