2017-10-14 5 views
1

私はちょうどncursesで遊んでいるので、本当に奇妙な動作を発見しました。C:ncurses、initscr()はgetchar()の動作を変更しますか?

私は、ncursesのlibからinitscr()を使用し、その後通常のgetchar()を使用すると、プログラムは最初のキーを押した後に終了します。

私が期待する通常のgetchar()の動作は、私がreturnを押すまで(多かれ少なかれ)入力できるということです。

#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/getch-and-putchar-not-working-without-return)が含まれます。 –

答えて

1

呪い呪いが単一文字の入力を検出できるように、(それがバッファなしであるかのように順番に接続されたストリームを作用させる)モードに端末入力を初期化します。 getcharは、入力がバッファされているとみなし、を入力してと入力して入力行を終了します。 モードでは、コールでキーを押すとすぐに何かが見つかるため、getcharがすぐに戻ります。

endwin以外にも、端末のraw/cookedモード間で切り替えるために他のcurses機能を使用できます(reset_shell_modereset_prog_modeのマニュアルを参照)。

+0

allright。とった!どうもありがとう! – Reppiz

+0

これは正しくありません。 Stdioのバッファリングはそれとは関係ありません。むしろ、それはttyのcooked/canonicalモードに関するものです。さらに、getcharは "入力がバッファされていると仮定"しておらず、端末が未調理モードに設定された後に何も間違っていません。 –

関連する問題