阅读k& r(c book)并混淆第一章代码

时间:2011-03-10 08:11:11

标签: c

#include <stdio.h>
/* copy input to output; 2nd version*/
main()
{
    int c;

    while ((c = getchar()) != EOF)
        putchar(c);
}

这非常令人困惑......因为你永远不会逃脱while循环。我已经知道EOF是-1。我键入-1但它只是重新打印它。这是一个永无止境的循环。随着时间的推移,图书馆会发生变化,并且与图书的预期不同?当我说库我的意思是库中的putchar()/ getchar()...抱歉。

3 个答案:

答案 0 :(得分:11)

EOF(文件结尾)的工作原理是什么?

EOF只是一个指定负值的宏。它不必是-1。您可以使用控制字符从命令行发出文件结束信号,通常是Windows系统的ctrl + z或POSIX系统的ctrl + d的组合。

当你写'-1'时,你不会写VALUE -1,而是写字符串{' - ','1'}

看看here

答案 1 :(得分:2)

EOF不是字符

这很重要。记住它。

当你试图获得角色时,可能会发生一些事情。通常是有效地阅读一个角色:你的程序接收该角色并继续前进......

int ch = getchar();

但是,会发生什么是磁盘崩溃?或者就在那个时候有一个坏的部门?还是网络崩溃了?或者没有更多数据?
那么,必须有一种方法可以将这些条件与普通字符区分开来。 C选择的方式是返回一个值从不可以解释为真实字符的值。该值为EOF,这是一个负值(即使您的实现使用unsigned char signed char),也会返回所有真实字符,其值转换为char。这就是为什么非常重要为字符使用int(而不是预期的char)。

所以EOF意味着无法读取角色。您可以尝试找出原因(网络故障?坏扇区?文件末尾?...)或者只是假设它是文件结尾并从那里开始。

所以,在

while ((c = getchar()) != EOF)

有两件事:作业和比较

c = getchar()
如果出现错误,

会在c中为真实字符设置0或更高的值;如果出现错误,则为EOF,因此

while ((c = getchar()) != EOF)

表示“将字符转换为变量c

时没有错误

要记住的重要事项:

EOF不是字符。使用int定义字符。

答案 2 :(得分:0)

输入文字后,按Enter键输入新行。然后按住Ctrl并按下字母D.

我正在写同一本书。我认为你应该能够按Ctrl + D退出,但我必须先按Enter键(我认为我的shell有问题)。

顺便说一句,这是在章节文本中。