EOF在输入中间

时间:2015-01-29 19:45:25

标签: c windows stdin eof

我的问题是关于如何在输入中间解释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?)

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

谢谢。

1 个答案:

答案 0 :(得分:0)

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

  

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