EOF在windows下的值

我写了这个代码:

#include <stdio.h> int main() { int c; while ((c = getchar()) != EOF) putchar(c); return 0; } 

在Windows下,我发现我必须inputctrl + z才能停止程序,我还打印了EOF的值,它是-1。 但是,当我input-1而不是ctrl + z程序继续执行,我想明白为什么。 谢谢!

输入"-1"作为文本不返回整数值-1而是两个字符,即'-' (对应于ASCII值45 )和'1' (对应于ASCII值49 )。 两者都不等于EOF (十进制中的-1 )。

根据定义,不能输入由getchar()作为负值消费的东西,因为负值被定义为表示“文件结束”。

如果你想读取一个整数值(如-1 ),使用scanf

 int num; if (scanf("%d", &num)==1) { // successfully read one valid integral value? printf("you entered number %d:", num); } 

当我输入-1代替ctrl + z程序继续执行,我想明白为什么

因为“-1”被解释为“ – ”和“1”,而不是紧凑的输入。 这就是为什么你不能用你的代码来捕捉它。

getchar()函数返回刚刚输入的字符的数字值(作为unsigned char处理,所以它从不是负数), 或者返回特殊值EOF ,表示不再有输入。

Windows使用Control-Z触发和文件结束条件,这会导致getchar()返回值EOF 。 但EOF不是一个字符值; 它被特别选择为一个不能成为字符值的值。

文件结束是一个条件,而不是一个值。 EOF是一个数值,但不是一个字符值; 它是getchar()返回的值,表示输入处于文件结束状态(或错误状态)。

(如果要读取整数值(正值或负值),则需要一次读取一个字符,然后计算字符序列所代表的整数值。整数值-1可以作为字符'-'输入由字符'1' atoi有不同的功能,如atoi*scanf家族,可以做转换。)

EOF不是“价值”。 它是由stdio库定义的一个stdio

Ctrl / z是一个按键 ,由终端驱动程序解释,并导致它通知流的结束从应用程序读取,这导致C read()返回零,从而导致getchar()返回EOF。

Unix,Linux等相应的按键是Ctrl / d。

你需要稍微改变一下逻辑:

 #include <stdio.h> int main() { int c; int done = 0; while (!done) { c = getchar(); if(c != '-') putchar(c); else { c = getchar(); if (c == '1')//this is an EOF { done = 1; // and probably putchar the EOF } else { putchar('-'); putchar(c); } }//else }//while return 0; 

}