阅读著名书籍C编程语言ANSI C第二版,作者Brian Kernighan和Dennis Ritchie,我在下面的第7章(第7.4节,第157页)中找到了描述scanf
格式字符串的以下段落:
[...]
格式字符串通常包含转换说明,该转换说明用于控制输入的转换。格式字符串可以包含:
- 空白或制表符,将被忽略。
[...]
而且我记得,如今我们使用格式字符串中的空格来告诉编译器跳过空格,直到找到非空格字符为止。因此,我认为由于多年以来C语言的更新,该段不再有效。我的意思是对的吗? 🤔
<< [圣经记录了scanf()
的过时版本。早期版本的scanf()
曾经忽略输入字符串中的所有空格,因此格式字符串中的空格也被忽略。在通过ANSI将C规范化,然后通过ISO规范化C之前,此行为已得到很好的改变。
scanf()
,其描述对于ANSI和更高版本是不正确的。事实上,man page from Version 7,1979年Bell Labs的原始Unix已经对此进行了记录:
控制字符串通常包含转换规范,用于直接解释输入序列。控制字符串可能包含:与输入中的可选空白匹配的空白,制表符或换行符。
- 必须与输入流的下一个字符匹配的普通字符(不是
%
。- 转换规范,由字符
%
,可选的分配抑制字符*
,可选的最大字段宽度和转换字符组成。
scanf()
几乎从Unix系统的第一天开始就具有当前行为。 scanf()
历来都是古怪且容易出错的,这一伟大发现增加了一系列陷阱和陷阱。您可以在书的第二版中找到更正某些错误的errata列表,但未列出此特定错误。
[为了进一步研究,可以在Dennis Ritchie's home page,Brian Kernighan's page on the book和here以及bitsavers.org archives上找到许多历史信息。