COHERENT manpages
This page displays the COHERENT manpage for scanf() [Accept and format input].
List of available manpages
Index
scanf() -- STDIO Function (libc)
Accept and format input
#include <stdio.h>
int scanf(format, arg1, ... argN)
char *format; [data type] *arg1, ... *argN;
scanf() reads the standard input, and uses the string format to specify a
format for each arg1 through argN, each of which must be a pointer.
scanf() reads one character at a time from format; white space characters
are ignored. The percent sign character `%' marks the beginning of a
conversion specification. `%' may be followed by characters that indicate
the width of the input field and the type of conversion to be done.
scanf() reads the standard input until the return key is pressed.
Inappropriate characters are thrown away; e.g., it will not try to write an
alphabetic character into an int.
scanf() returns the number of arguments filled. It returns EOF if no
arguments can be filled or if an error occurs.
Modifiers
The following modifiers can be used within the conversion string:
1. An asterisk `*', which tells scanf to skip the next conversion; that is,
read the next token but do not write it into the corresponding argument.
2. A decimal integer, which tells scanf the maximum width of the next field
being read. How the field width is used varies among conversion
specifier. See the table of specifiers below for more information.
3. One of the three modifiers h, l, or L, whose use is described below.
Modifiers
The following three modifiers may be used before a conversion specifier:
h When used before the conversion specifiers d, i, o, u, x, or X, it
specifies that the corresponding argument points to a short int or an
unsigned short int. When used before n, it indicates that the
corresponding argument points to a short int. In implementations
where short int and int are synonymous, it is not needed. However, it
is useful in writing portable code.
l When used before the conversion specifiers e, E, f, F, or G, it
indicates that the corresponding argument points to a double rather
than a float.
L When used before the conversion specifiers e, E, f, F, or G, it
indicates that the corresponding argument points to a long double
rather than a float.
Conversion Specifiers
scanf() recognizes the following conversion specifiers:
c Assign the next input character to the next arg, which should be of type
char *. The field width specifies the number of characters (default,
one). scanf() does not write a null character at the end of the array
it creates. This specifier forces scanf() to read and store white-space
characters and numerals, as well as letters.
d Convert the token to a decimal integer. The format should be equivalent
to that expected by the function strtol() with a base argument of ten.
The corresponding argument should point to an int.
D Assign the decimal integer from the next input field to the next arg,
which should be of type long *.
e Convert the token to a floating-point number. The format of the token
should be that expected by the function strtod() for a floating-point
number that uses exponential notation. The corresponding argument
should point to a float if no modifiers are present, to a double if the
l modifier is present, or to a long double if the L modifier is present.
E Same as e. Prior to release 4.2 of COHERENT, this conversion specifier
converted the token to a double. This change has been made to conform to
the ANSI Standard, and may require that some code be rewritten.
f Convert the token to a floating-point number. The format of the token
should be that expected by the function strtod() for a floating-point
number that uses decimal notation. The corresponding argument should
point to a double.
g Convert the token to a floating-point number. The format of the token
should of that expected by the function strtod() for a floating-point
number that uses either exponential notation or decimal notation. The
corresponding argument should point to a float if no modifiers are
present, to a double if the l modifier is present, or to a long double
if the L modifier is present.
G Same as g.
i Convert the token to a decimal integer. The format should be equivalent
to that expected by the function strtol() with a base argument of zero.
The corresponding argument should point to an int.
n Do not read any text. Write into the corresponding argument the number
of characters that scanf() has read up to this point. The corresponding
argument should point to an int.
o Assign the octal integer from the next input field to the next arg,
which should be of type int *.
O Assign the octal integer from the next input field to the next arg,
which should be of type long *.
p The ANSI standard states that the behavior of the %p conversion
specificer is implementation-specific. Under COHERENT, %p converts a
strings of digits in hexadecimal notation into an address. For example,
in the code
char buf[] = "0x7FFFFDBC";
char *foo;
...
sscanf(buf, "%p", &foo);
the %p specifier reads the contents of buf and turns them into an
address, which it then uses to initialize the pointer foo. You can use
the %p specifier to turn back into an address the output of printf()'s
%p specifier. Please note that abuse of this specifier can create all
manner of fascinating bugs within your programs: Caveat utilitor.
r The next argument points to an array of new arguments that may be used
recursively. The first argument of the list is a char * that contains a
new format string. When the list is exhausted, the routine continues
from where it left off in the original format string.
s Assign the string from the next input field to the next arg, which
should be of type char *. The array to which the char * points should
be long enough to accept the string and a terminating null character.
u Convert the token to an unsigned integer. The format should be
equivalent to that expected by the function strtoul() with a base
argument of ten. See strtoul for more information. The corresponding
argument should point to an unsigned int.
x Convert the token from hexadecimal notation to a signed integer. The
format should be equivalent to that expected by the function strtol with
a base argument of 16. See the Lexicon entry for strtol() for more
information. The corresponding argument should point to an unsigned
int.
X Same as x. Prior to release 4.2 of COHERENT, X meant the same as the
current lx; that is, the corresponding argument points to a long instead
of an int. This has been changed to conform to the ANSI Standard, and
may require that some code be rewritten.
It is important to remember that scanf() reads up, but not through, the
newline character: the newline remains in the standard input device's
buffer until you dispose of it somehow. Programmers have been known to
forget to empty the buffer before calling scanf() a second time, which
leads to unexpected results.
Example
The following example uses scanf() in a brief dialogue with the user.
#include <stdio.h>
main()
{
int left, right;
printf("No. of fingers on your left hand: ");
/* force message to appear on screen */
fflush(stdout);
scanf("%d", &left);
/* eat newline char */
while(getchar() != '\n')
;
printf("No. of fingers on your right hand: ");
fflush(stdout);
scanf("%d", &right);
/* again, eat newline */
while(getchar() != '\n')
;
printf("You've %d left fingers, %d right, & %d total\n",
left, right, left+right);
}
See Also
fscanf(),
libc,
sscanf()
ANSI Standard, §7.9.6.4
POSIX Standard, §8.1
Notes
Because C does not perform type checking, it is essential that an argument
match its specification. For that reason, scanf() is best used to process
only data that you are certain are in the correct data format. Rather than
use scanf() to obtain a string from the keyboard: we recommend that you use
gets() to obtain the string, and use strtok() or sscanf() to parse it.

















