输入缓冲区刷新

时间:2016-12-14 06:33:04

标签: c eof getchar

请考虑以下代码:

#include<stdio.h>
int main(){
char c;
while( ( c=getchar() ) != EOF )
        printf("%c\n",c);
return 0; 
}

我输入的内容为:hi ^ Z

输出结果为:

h
i
(an arrow pointing towards left) 

[抱歉,我无法找到上述箭头的字符。 ]

有人可以解释输出吗?由于^ Z是字符串的一部分,并且有要冲洗的字符,我认为^ Z不应该被传递,因此输出应该是,

h
i
(new line )

P.S - 我在窗户上,因此^ Z就是EOF。

2 个答案:

答案 0 :(得分:4)

问题在于,char不足以保存EOF的值。您需要使用int类型。

char c;更改为int c;

也就是说,getchar()将返回标准输入中的任何待处理项。如果在输入后使用键组合,则操作类似于刷新流。要从EOF返回getchar(),您需要再次按下组合键。

简而言之,如果您希望getchar() CTRL + Z 上返回EOF,请确保stdin中没有任何内容1}}。

也就是说,对于托管环境,main()的正确签名至少为int main(void)

答案 1 :(得分:1)

参考http://www.cplusplus.com/reference/cstdio/getchar/ 它表示getchar的返回类型为int。编译器应该发出警告。请不要忽视此类警告。

您要将int分配给char,这将导致丢失。尝试将其打印到int并打印出来。

您也可以使用intprintf打印%c并将其转型为char