【问题标题】:ctrl-d didn't stop the while(getchar()!=EOF) loop [duplicate]ctrl-d 没有停止 while(getchar()!=EOF) 循环[重复]
【发布时间】:2012-08-10 06:33:29
【问题描述】:

这是我的代码。我用终端在 ubuntu 中运行它。当我在终端中输入 (a CtrlD) 时,程序并没有停止而是继续等待我的输入。

CtrlD不等于unix中的EOF吗?

谢谢。

#include<stdio.h>

main() {
    int d;
    while(d=getchar()!=EOF) {
        printf("\"getchar()!=EOF\" result is %d\n", d);
        printf("EOF:%d\n", EOF);
    }
        printf("\"getchar()!=EOF\" result is %d\n", d);
}

【问题讨论】:

  • 这不是递归。在您 EOL 输入之前,这只是一个无限循环。递归 = 函数直接调用自身或在其他一些中间步骤之后调用自身。
  • 用 gcc 编译,点击 ^D 为我停止了循环。
  • @JonLin 只需输入 ^D 。它也适用于我。但是,当输入为 (a^D); 时,循环并没有停止。
  • @MarcB 我犯了一个愚蠢的错误。感谢您的帮助。

标签: c unix eof


【解决方案1】:

EOF 不是字符。 EOF 是一个宏,getchar() 在到达输入末尾或遇到某种错误时返回。 ^D 不是“EOF 字符”。当您在一行上单独点击 ^D 在 linux 下发生的事情是它关闭了流,并且 getchar() 调用到达输入的末尾并返回 EOF 宏。如果您在一行中间的某处键入^D,则流不会关闭,因此getchar() 返回它读取的值并且您的循环不会退出。

请参阅stdio section of the C faq 以获得更好的描述。

另外:

在现代系统上,它不反映存储在文件中的任何实际文件结束字符;这是没有更多可用字符的信号。

【讨论】:

  • 我仔细阅读了网站。在我看来,如果我在一行中间的某处输入^D,bash 将处理^D。结果,C 程序没有得到关闭流的命令。如果我在一行中键入^D,C 程序将得到正确的命令。我说的对吗?
  • @qingfeng 这里有更多关于^D 的信息:c-faq.com/stdio/eofval.html 但是,是的,除非它自己在一条线上,否则流不会被关闭。此处简短说明:stackoverflow.com/a/1516177/851273
  • 当终端处于规范模式时,在您按下回车之前,不会通过 tty 设备传输行。按下配置的 EOF 键(默认为 ^D)会导致数据立即传输,并且任何等待它的read 返回可用的字符数。如果该行已经有数据,这将是一个正常的、非零长度的读取。如果该行为空,这将导致零长度读取,这是文件描述符上文件结束状态的定义。因此 stdio 层会将其解释为 EOF 状态。
  • @qingfeng:bash 与它无关;当前正在运行的程序正在处理输入。
  • @R..,您的评论应该是一个答案,它应该是最佳答案。现在越来越难找到完整的“幕后”信息......
【解决方案2】:

除了 Jon Lin 关于 EOF 的回答之外,我不确定您编写的代码是否符合您的预期。如果您想在变量d 中查看从getchar 返回的值,您需要将您的while 语句更改为:

    while((d=getchar())!=EOF) {

这是因为不等式运算符的优先级高于赋值。因此,在您的代码中,d 始终是 01

【讨论】:

  • 你这么细致真是太好了。但我只是想验证表达式d=getchar()!=EOF 是0 还是1。
  • @Sam:您可以通过以下方式明确表示您正在分配比较结果:while ((d = (getchar() != EOF)) != 0)while ((d = (getchar() != EOF))),这样编译器就不会向您发出警告。更常见的替代方法是while ((d = getchar()) != EOF),它将getchar() 的结果分配给d,然后将其与EOF 进行比较。这是为了避免编译器警告。许多现代编译器会为您编写的内容生成警告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多