prev up next   top/contents search

comp.lang.c FAQ list · Question 12.17

Q: When I read numbers from the keyboard with scanf and a "%d\n" format, like this:

	int n;
	scanf("%d\n", &n);
	printf("you typed %d\n", n);
it seems to hang until I type one extra line of input.


A: Perhaps surprisingly, \n in a scanf format string does not mean to expect a newline, but rather to read and discard characters as long as each is a whitespace character. (In fact, any whitespace character in a scanf format string means to read and discard whitespace characters. [footnote] Furthermore, formats like %d also discard leading whitespace, so you usually don't need explicit whitespace in scanf format strings at all.)

The \n in "%d\n" therefore causes scanf to read characters until it finds a non-whitespace character, and it may need to read another line before it can find that non-whitespace character. In this case, the fix is just to use "%d", without the \n (athough your program may then need to skip over the unread newline; see question 12.18a).

scanf was designed for free-format input, which is seldom what you want when reading from the keyboard. By ``free format'' we mean that scanf does not treat newlines differently from other whitespace. The format "%d %d %d" would be equally happy reading the input

	1 2 3
or
	1
	2
	3

(By way of comparison, source code in languages like C, Pascal, and LISP is free-format, while traditional BASIC and FORTRAN are not.)

If you're insistent, scanf can be told to match a newline, using the ``scanset'' directive:

	scanf("%d%*[\n]", &n);
Scansets, though powerful, won't solve all scanf problems, however. See also question 12.20.

References: K&R2 Sec. B1.3 pp. 245-6
ISO Sec. 7.9.6.2
H&S Sec. 15.8 pp. 357-64


prev up next   contents search
about this FAQ list   about eskimo   search   feedback   copyright

Hosted by Eskimo North