2017-10-14 88 views
1

我只是玩弄ncurses,所以,我发现了一个非常奇怪的行为。C:ncurses,initscr()更改getchar()的行为?

当我使用initscr的()从ncurses的lib和事后我使用正常的getchar(),则程序按压第一键之后终止。

正常的getchar()行为我所期望的,是我可以输入(或多或少),只要等我按回车键。

#include "curses.h" 

int main() 
{ 
    initscr(); 
    getchar(); 
    //endwin(); 

    return 0; 
} 

任何人都可以解释为什么会发生这种情况吗?

+0

记录和()'退出之前显示从'的getchar的值。包括'endwin()',除非你喜欢重置你的终端特性(或者,我想,除非你使用的IDE在运行程序时创建一个新的终端窗口)。当你使用'initscr()'或类似的,你改变标准输入的规则。不要指望正常的行为;规则已经改变。 –

+0

你可以在[https://stackoverflow.com/questions/10256477/getch-and-putchar-not-working-without-return](https://stackoverflow.com/questions)找到一个很好的例子,/10256477 /残培和-的putchar - 不工作,不回)。 –

回答

1

诅咒初始化端子输入到原始模式(这又使得所连接的流充当如果它是缓冲),从而诅咒可以检测单字符输入。 getchar假定输入缓冲,这样你就按输入结束的输入线。在模式,getchar立即返回,因为read呼叫只要你按一个键找到的东西。

除了endwin,您还可以使用其他curses功能在终端的原始/熟化模式之间来回切换(请参阅reset_shell_modereset_prog_mode的手册)。

+0

好。得到它了!非常感谢! – Reppiz

+0

这是不正确的。 Stdio缓冲与它无关。而是关于tty的烹饪/规范模式。此外,getchar不会“假设输入被缓冲”,并且在终端设置为未烹饪模式后没有做任何错误。 –