我正在使用Visual Studio 2010运行以下简单程序。目的是看看如果我将变量c
定义为char
或int
会发生什么,因为{{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上测试这个程序,但有人可以解释为什么会这样吗?
答案 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字符。