【问题标题】:How is this program meant to work?这个程序是如何工作的?
【发布时间】:2012-08-27 16:50:35
【问题描述】:

我一直在阅读 Kernighan 和 Ritchie 的 The C Programming Language 并且很早就拥有了我遇到了一个不起作用的程序,即使我直接从书中复制了它。这是描述的屏幕截图 - http://i.imgur.com/SBQSE.png

它陷入了无限循环,因为我输入的任何内容显然都是键盘输入,并且它正在检查 EOF,这显然不是键盘输入。

#include <stdio.h> 
/* copy input to output; 1st version  */ 
main() 
{ 
    int c; 
    c = getchar(); 
    while (c != EOF) { 
        putchar(c); 
        c = getchar(); 
    } 
}

这样的 C 权威书籍肯定不会有错误,我是不是遗漏了什么?

【问题讨论】:

    标签: c infinite-loop ansi


    【解决方案1】:

    EOF 是文件结束符。试试 Ctrl-D。

    【讨论】:

    • Ctrl-D 在最合适的操作系统上。
    • Ctrl+C 的作用与 Ctrl+D 不同。
    • 哈哈是的。我只是记住并编辑了它。什么是“合适的”操作系统?
    • "Proper" = 几乎是除 Windows 以外的任何操作系统。 ;)
    【解决方案2】:

    在从命令行读取时,您可以运行它并使用ctrl + d 发出 EOF(文件结束)信号。

    如果您正在从文件中读取字节流,那么它会自动将其包含在其中。但是,由于您是从命令行读取,因此需要使用上面的键序列手动指示文件结束。

    实际工作原理

    EOF 通常在(至少在 glibc 中)表示 -1,这就是为什么你不能只说 while(c) { do work; } 因为任何非零值都是真的——因此 EOF 是真的,就像返回的任何其他正数字符一样致电getchar()。这就是为什么当您使用ctrl + d 发送EOF 信号时,您必须直接检查c 是否与代码c != EOF 匹配EOF (-1)。

    【讨论】:

    • 在 Windows 上,它会是 Ctrl+Z,iirc。
    • 如果我没记错的话,如果它没有改变,在 Windows 和 DOS 中,ctrl-Z 被放置为流中的实际字符。在 Unix 中,ctrl-D 实际上不是作为字符发送的,它实际上并不意味着文件结束,它意味着刷新。这就是我在stackoverflow.com/questions/1516122/… 中写的内容……
    • 谢谢,` ctrl + d ` 奏效了! ` ctrl + z ` 不起作用
    • @Geesh_SO 是的,Ctrl-D 用于普通操作系统,Ctrl-Z 用于 Windows。尽管在普通操作系统上,Ctrl-Z 应该暂停您的程序以继续按照fg
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 2023-04-11
    相关资源
    最近更新 更多