【问题标题】:Input buffer flush输入缓冲区刷新
【发布时间】:2016-12-14 06:33:04
【问题描述】:

考虑下面的代码:

#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 - 我在 windows 上,^Z 因此是 EOF。

【问题讨论】:

  • 当我将^Z 放在单独的一行时,它对我很有用。

标签: c eof getchar


【解决方案1】:

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

char c; 更改为int c;

也就是说,getchar() 将在标准输入中返回 any 待处理项。如果您在某些输入后使用组合键,则操作类似于 flushing 流。要获取从getchar() 返回的EOF,您需要再按一次组合键。

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

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

【讨论】:

  • 你能解释一下那个字符“箭头”是从哪里来的吗?我的意思是说,输出中 h 和 i 的存在很好,但箭头的事情让我很困扰。我猜,^Z 不应该被传递给程序,尽管它存在于给定的输入中?为什么会通过?
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-19
    • 2014-03-13
    • 1970-01-01
    • 2014-10-01
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    相关资源
    最近更新 更多