prev up next   top/contents search

comp.lang.c FAQ 列表· 第 12.17 题

当我从键盘读取数字时,使用scanf和 y"%d\n"格式,就像这样

	int n;
	scanf("%d\n", &n);
	printf("you typed %d\n", n);
它似乎会挂起,直到我输入额外的行。


也许令人惊讶的是,\nscanf格式字符串并不意味着期望一个换行符,而是读取并丢弃所有连续的空白字符。(实际上,在scanf格式字符串中的任何空白字符都意味着读取并丢弃空白字符。[脚注] 此外,像%d这样的格式也会丢弃前导的空白字符,所以您通常不需要在scanf格式字符串中使用显式的空白字符。)

\n"%d\n"因此导致scanf读取字符直到找到一个非空白字符,它可能需要读取另一行才能找到那个非空白字符。在这种情况下,修复方法只是使用"%d",不带\n(尽管您的程序可能需要跳过未读取的换行符;参见问题 12.18a)。

scanf被设计为自由格式输入,这很少是您从键盘读取时想要的结果。所谓“自由格式”,我们的意思是scanf不将换行符与其他空白字符区别对待。格式"%d %d %d"在读取输入时同样会感到满意

	1 2 3
	1
	2
	3

(作为比较,像 C、Pascal 和 LISP 这样的语言的源代码是自由格式的,而传统的 BASIC 和 FORTRAN 则不是)。

如果您坚持scanf 可以告知它匹配一个换行符,使用“扫描集”指令

	scanf("%d%*[\n]", &n);
扫描集虽然强大,但并不能解决所有scanf问题。另请参见问题 12.20

参考文献:K&R2 第 B1.3 节 pp. 245-6
ISO 第 7.9.6.2 节
H&S 第 15.8 节 pp. 357-64


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管