2

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

#include <stdio.h> 

int main() 

{ 
   char c; 
   //int c;

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

       putchar(c);

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

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

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

在此处输入图像描述

4

2 回答 2

2

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

你需要记住那EOF不是一个字符。当您键入“ABCDEF CTRL-Z”时,您将输入八个输入字符:ABCDEFCTRL-ZReturn。唯一特殊的CTRL-Z(或CTRL-D在 Unix/Linux 上)是,如果您在新行的第一件事中键入它,那么终端不会输入字符,而是会表现得好像已经到达输入文件的末尾。该getchar()函数将返回EOF。由于任何可以放入 an 的可能值unsigned char都是 的有效返回值getchar()EOF因此可以通过负数与任何有效返回值区分开来,这就是为什么getchar()和 family 被定义为 return的原因int

于 2013-07-11T15:30:56.727 回答
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 字符。

于 2013-07-11T15:33:11.347 回答