【问题标题】:reading k&r(c book) and confusing 1st chapter code阅读 k&r(c book) 和混淆第一章代码
【发布时间】:2011-07-12 17:22:11
【问题描述】:
#include <stdio.h>
/* copy input to output; 2nd version*/
main()
{
    int c;

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

这很令人困惑...因为您永远不会逃脱 while 循环。我知道EOF是-1。我输入 -1 但它只是重新打印它。这是一个永无止境的循环。随着时间的推移,图书馆是否发生了变化,与本书的预期有所不同?当我说图书馆时,我的意思是图书馆里的 putchar()/getchar()……对不起。

【问题讨论】:

  • 这属于 Stack Overflow

标签: c


【解决方案1】:

EOF(文件结尾)如何工作?

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

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

看看here

【讨论】:

    【解决方案2】:

    EOF 不是字符

    这很重要。记住它。

    当您尝试获取角色时,可能会发生几件事。通常是有效地读取一个字符:您的程序接收该字符并继续执行...

    int ch = getchar();
    

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

    所以EOF 表示无法读取字符。您可以尝试找出原因(网络故障?坏扇区?文件结尾?...)或者简单地假设它是文件结尾并从那里开始。

    所以,在

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

    有两件事:赋值和比较

    c = getchar()
    

    如果有错误,将在 c 中输入 0 或更大的值来表示真实字符或 EOF,因此

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

    表示“虽然将字符放入变量c没有错误”

    要记住的重要事项:

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

    【讨论】:

      【解决方案3】:

      输入文本后,按 Enter 键换行。然后按住 Ctrl 并按字母 D。

      我正在写同一本书。我认为您应该可以按 Ctrl+D 退出,但我必须先按 Enter(我认为我的外壳有问题)。

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

      【讨论】:

      • 如果你按 Ctrl-D 两次,终端(不是 shell)将向程序发出 EOF 信号。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 2018-08-01
      • 2017-03-01
      • 1970-01-01
      相关资源
      最近更新 更多