K&R C 书关于 scanf 如何处理格式字符串中的空格和制表符的问题?

Problem with K&R C book regarding how scanf deals with blanks and tabs in the format string?

阅读着名的书The C programming language ANSI C second edition by Brian Kernighan and Dennis Ritchie,我在第 7 章(第 7.4 节,第 157 页)中找到了下面的这段描述 scanf:

的格式字符串

[...]

The format string usually contains conversion specifications, which are used to control conversion of input. The format string may contain:

  • Blanks or tabs, which are ignored.

[...]

我记得现在我们在格式字符串中使用 space 来告诉编译器跳过白色 space 直到找到非白色 space 字符。因此,我认为由于多年来 C 语言的更新,该段不再有效。我说的对不对?

C 圣经 记录了 scanf() 的过时版本。 scanf() 的早期版本用于忽略输入字符串中的所有白色 space,因此格式字符串中的白色 space 也被忽略。这种行为在 C 被 ANSI 规范化和后来被 ISO 规范化之前就已经改变了。

第二版的封面确实提到了ANSI-C,但是关于scanf(),它对ANSI及以后版本的描述是不正确的。

事实上 man page from Version 7,1979 年贝尔实验室的原始 Unix 已经记录了这一点:

The control string usually contains conversion specifications, which are used to direct interpretation of input sequences. The control string may contain:

  1. Blanks, tabs or newlines, which match optional white space in the input.
  2. An ordinary character (not %) which must match the next character of the input stream.
  3. Conversion specifications, consisting of the character %, an optional assignment suppressing character *, an optional numerical maximum field width, and a conversion character.

没有实际的编译器支持书中记录的古老行为。在研究了 K&R 中的这个令人惊讶的错误之后,似乎 scanf() 几乎从 Unix 系统诞生的第一天起就有了当前的行为。 scanf() 一直以来都是古怪且容易出错的,这一伟大发现增加了一系列陷阱和陷阱。

您可以在本书的第二版中找到 errata 更正一些错误的列表,但未列出此特定错误。

为了进一步调查,可以在Dennis Ritchie's home page, Brian Kernighan's page on the book, and here, and on bitsavers.org archives上找到很多历史信息。