问当我从键盘读取数字时,使用scanf和 y"%d\n"格式,就像这样
int n; scanf("%d\n", &n); printf("you typed %d\n", n);它似乎会挂起,直到我输入额外的行。
答也许令人惊讶的是,\n中scanf格式字符串并不意味着期望一个换行符,而是读取并丢弃所有连续的空白字符。(实际上,在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