2016-12-14 105 views
2

考虑下面的代码:输入缓冲器冲洗

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

我给输入为:喜^ Z

输出为:

h 
i 
(an arrow pointing towards left) 

[对不起,我无法找到上述箭头的字符。 ]

有人可以解释输出吗?由于^ Z是字符串的一部分,并有字符以红晕,我觉得^ Z不应该都已经过去了,因此输出应该是,

h 
i 
(new line) 

PS - 我在Windows并且^ Z因此是EOF。

+0

当我把'^ Z'放在一个单独的行上时,它对我很好。 – Quirk

回答

4

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

char c;更改为int c;

也就是说,getchar()将返回任何标准输入中的未决项目。如果您在输入一些内容后使用了组合键,则该操作与冲洗流类似。要从getchar()返回EOF,您需要再次按下组合键。

总之,如果你希望getchar()CTRL +ž返回EOF确保没有什么是在stdin

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

+0

你能解释一下那个角色出​​现在哪里吗?我的意思是说,输出中的h和i的存在没有问题,但箭头事情正在困扰着我。我想,^ Z不应该被传递给程序,尽管它在给定的输入中存在?为什么它会通过? – Wayne

1

参照http://www.cplusplus.com/reference/cstdio/getchar/ 它说getchar返回类型是int。编译器应该给出警告。请不要忽略这些警告。

您正在分配intchar这将导致损失。尝试将其放入int并打印出来。

您也可以使用%cprintf中打印int,并将类型转换为char