【问题标题】:EOF in the middle of an input输入中间的EOF
【发布时间】:2015-03-29 04:23:23
【问题描述】:

我的问题是关于如何在输入中间解释 EOF,这是一个示例:

int main() {

  int a, b;
    printf("enter something >\n");
    scanf("%d", &a);
    while((b = getchar()) != EOF) {
      printf("%i\n", b);
    }
  return b;
 }

我运行程序并输入:

 1hello^Z(control+z)abc

输出是:

 104 (ascii number for h)
 101 (for e)
 108 (l)
 108 (l) 
 111 (o)
 26 (what is this?)

scanf 读取数字 1,剩余的留在缓冲区中,getchar() 获取所有这些直到 ^Z,这是预期的行为,因为控件 z 关闭标准输入。 但是 26 是从哪里来的?如果 getchar() 读取的最后一件事是 EOF,为什么 -1 不是最后一个值?还有为什么这个程序在读取^Z时不退出循环,为什么我需要用控件z再调用一次EOF来终止循环? 26 是 SUB 的 ascii,我不知道该怎么做。

谢谢。

【问题讨论】:

  • Ctrl-Z ASCII 26.
  • 我认为控件 Z 已自动转换为 EOF,其具有负值,通常为 -1
  • EOF 将被报告为 -1,但这并不是真正的转换。 DOS/Windows 终端有一个讨厌的习惯,即实际上首先在输入中包含 Ctrl-Z。有人可能会过来纠正我的细节,但基本上就是这样。
  • 你使用的是什么操作系统?
  • 我有点惊讶您在输入中看到 ^Z。在 Unix(Mac、Linux)上,对应的字符通常是 ^D(control-D 而不是 control-Z)。如果您在一行上键入一些数据,然后 ^D,则发送数据。这是一个非零字节数,因此读取成功(尽管没有换行符)并继续。如果您键入更多数据,则将在再次键入 ^D 或按下换行符(回车)时读取并返回到应用程序。如果连续两次键入 ^D,则第二次表示可用的字节数为零,这就是 EOF。或者它是 EOF,您在行首键入 ^D。

标签: c windows stdin eof


【解决方案1】:

当循环结束时,b=26 因为你输入了 ctrl+z 并且在返回时被解释为 SUB .http://en.wikipedia.org/wiki/Substitute_character

在 ASCII 和 Unicode 字符集中,此字符 (SUB) 由数字 26(1A 十六进制)编码。当同时按下 Ctrl 和 Z 键时,标准键盘会传输此代码(Ctrl+Z,通常称为 ^Z)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多