(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