控制台输入到C程序的奇怪现象

时间:2013-07-11 14:55:26

标签: c windows input eof

我正在使用Visual Studio 2010运行以下简单程序。目的是看看如果我将变量c定义为charint会发生什么,因为{{1函数返回一个整数(C编程语言中一个众所周知的陷阱,请参考int c = getchar()?)。

getchar()

当我从控制台输入一些字符到这个程序时,我发现了一个奇怪的现象,如下图所示。如果输入的#include <stdio.h> int main() { char c; //int c; while((c = getchar()) != EOF) putchar(c); printf("%d\n",c); return 0; } 跟随一系列字符(第一行),则无法正确识别(小的右箭头是输出,第二行)。但是,如果它是独立输入(第4行),则可以正确识别并终止程序。

我没有在Linux上测试这个程序,但有人可以解释为什么会这样吗?

enter image description here

2 个答案:

答案 0 :(得分:2)

您所描述的基本上是终端的设计方式。

您需要记住EOF不是角色。当您键入“ABCDEF CTRL-Z ”时,您输入八个输入字符: A B C D E F CTRL-Z 返回。关于 CTRL-Z (或Unix / Linux上的 CTRL-D )唯一特别之处在于,如果你在新行上输入第一个内容,那么输入字符时,终端的行为就像已到达输入文件的末尾一样。 getchar()函数将返回EOF。由于unsigned char中任何可能适合getchar()的值都是EOF的有效返回值,因此可以将getchar()与任何有效的返回值区分开来,这就是为什么{int 1}}和family被定义为返回{{1}}。

答案 1 :(得分:1)

如果稍微更改程序并输入两个printf语句,您将看到程序实际上可以正确读取CRTL + Z组合(ASCII代码26):

#include <stdio.h> 

int main() 

{ 
   char c; 
   //int c;

   while((c = getchar()) != EOF) {
       printf("%d\n",c);
       putchar(c);
       printf("\n");
   }

   printf("%d\n",c);
   return 0;
 }

但正如上面的答案所说,它必须在它自己的路线上;为了正确解释。因为在Windows上,每行除了最后一行之外都有一个EOL字符。最后一行后面有一个EOF字符。