我写了这个代码:
#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;
}