关于windows:控制台输入到C程序的奇怪现象

Strange phenomenon of console input to a C program

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

int main()

{
   char c;
   //int c;

   while((c = getchar()) != EOF)

       putchar(c);

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

当我从控制台向这个程序输入一些字符时,发现了一个奇怪的现象,如下图所示。如果输入的EOF遵循字符序列(第一行),则无法正确识别(右小箭头为ouput,第二行)。但是,如果它是独立输入的(第4行),则可以正确识别它并终止程序。

我没有在Linux上测试这个程序,但是有人能解释为什么会发生这种情况吗?

enter image description here


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

您需要记住,EOF不是一个字符。键入"abcdefctrl zakbd"时,将输入八个输入字符:abcdefctrl zakbd和returnCtrlZakbd(或CtrlDakbd,在Unix/Linux上)唯一的特殊之处是,如果您在新行中键入它作为第一个内容,那么终端的行为就好像输入文件的结尾已经到达一样,而不是输入字符。getchar()函数将返回EOF。由于任何可以放入unsigned char中的可能值都是getchar()的有效返回值,因此EOF可以通过为负数区别于任何有效返回值,这就是getchar()和family被定义为返回int的原因。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

int main()

{
   char c;
   //int c;

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

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

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