getchar()意外行为

时间:2013-09-28 01:18:00

标签: c getchar

char ch;
while((ch = getchar()) != EOF){
    putchar(ch);
}

上面的代码显然应该复制我的输入。对于基本的ASCII文本文件,它确实有效。

但是,如果我发送一个gif,特别是这个,但适用于大多数(http://www.cs.utexas.edu/~peterson/prog2/smile.gif),那么当我将stdin重定向为gif,stdout重定向到任何文件类型,并运行diff原创和新的,错误丰富。在这种情况下,超过一半的文件甚至没有处理,它只是退出。 有线索吗?我愿意切换到另一个输入/输出功能,只要我一次可以输入一个字节。

1 个答案:

答案 0 :(得分:4)

getchar会返回int,而非char。区别很重要,因为它可能返回EOF,这是一个不能成为char的值。

如果将getchar的返回值转换为char,则无法可靠地测试EOF。当你点击值为(char)EOF的字符时,循环将终止。

通过将ch声明为int来修复此问题。