阅读布赖恩·克尼汉和丹尼斯·里奇的著名著作“C编程语言ANSI C第二版”,我在第7章( 7.4节)中找到了这本书。(第157页)下面这一段描述scanf的格式字符串
..。 格式字符串通常包含转换规范,用于控制输入的转换。格式字符串可能包含:
..。
我记得现在我们使用格式字符串中的空格来告诉编译器跳过空白直到找到一个非空白字符。因此,我假设这一段不再有效,因为C语言经过多年的更新。我说的对不对?
发布于 2020-05-09 22:31:12
C圣经记录了一个过时的scanf()版本。早期版本的scanf()用于忽略输入字符串中的所有空白,因此格式字符串中的空白也被忽略。这种行为在C被ANSI标准化之前就已经改变了,后来又被ISO标准化了。
第二版的书封面确实提到了ANSI-C,但是关于scanf(),它的描述对于ANSI和以后的版本是不正确的。
事实上,1979年贝尔实验室的最初的Unix已经证明了这一点:第7版手册页:
控制字符串通常包含转换规范,用于直接解释输入序列。控制字符串可能包含:
%)。%、可选赋值抑制字符*、可选数字最大字段宽度和转换字符组成。没有实际的编译器支持书中记录的古代行为。在研究了K&R中这个令人惊讶的错误之后,scanf()似乎几乎从Unix系统的第一天起就有了当前的行为。scanf()一直是古怪和容易出错,这一伟大的发现增加了一系列的陷阱和陷阱。
您可以在本书的第二版中找到纠正某些错误的errata列表,但是没有列出这个特定的错误。
对于进一步的研究,可以在丹尼斯·里奇的主页、布赖恩·克尼汉在书上的一页和这里以及bitsavers.org档案上找到许多历史信息。
https://stackoverflow.com/questions/61704170
复制相似问题