2017-10-14 136 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不會「假設輸入被緩衝」,並且在終端設置爲未烹飪模式後沒有做任何錯誤。 –