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

问题描述 投票:3回答:1

阅读著名书籍C编程语言ANSI C第二版,作者Brian Kernighan和Dennis Ritchie,我在下面的第7章(第7.4节,第157页)中找到了描述scanf格式字符串的以下段落:

[...]

格式字符串通常包含转换说明,该转换说明用于控制输入的转换。格式字符串可以包含:

  • 空白或制表符,将被忽略。

[...]

而且我记得,如今我们使用格式字符串中的空格来告诉编译器跳过空格,直到找到非空格字符为止。因此,我认为由于多年以来C语言的更新,该段不再有效。我的意思是对的吗? 🤔

c scanf kernighan-and-ritchie ansi-c
1个回答
3
投票

<< [圣经记录了scanf()的过时版本。早期版本的scanf()曾经忽略输入字符串中的所有空格,因此格式字符串中的空格也被忽略。在通过ANSI将C规范化,然后通过ISO规范化C之前,此行为已得到很好的改变。

第二版的书皮确实提到了ANSI-C,但是关于scanf(),其描述对于ANSI和更高版本是不正确的。

事实上,man page from Version 7,1979年Bell Labs的原始Unix已经对此进行了记录:

控制字符串通常包含转换规范,用于直接解释输入序列。控制字符串可能包含:

    与输入中的可选空白匹配的空白,制表符或换行符。
  1. 必须与输入流的下一个字符匹配的普通字符(不是%
  2. 转换规范,由字符%,可选的分配抑制字符*,可选的最大字段宽度和转换字符组成。
  • 没有实际的编译器支持本书中记录的古老行为。在研究了K&R中的这一令人惊讶的错误之后,似乎scanf()几乎从Unix系统的第一天开始就具有当前行为。 scanf()历来都是古怪且容易出错的,这一伟大发现增加了一系列陷阱和陷阱。

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

    [为了进一步研究,可以在Dennis Ritchie's home pageBrian Kernighan's page on the bookhere以及bitsavers.org archives上找到许多历史信息。

  • © www.soinside.com 2019 - 2024. All rights reserved.