コードに基づくSSCCE(短い、自己完結型、完全な例)は次のとおりです。
#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
int main(void)
{
int ch;
char input[100];
initscr();
raw();
keypad(stdscr, TRUE);
noecho();
ch = getch();
endwin();
if (ch== KEY_UP)
printf("\nUp Arrow\n");
if (ch== KEY_DOWN)
printf("\ndown Arrow\n");
fflush(stdout);
while(1)
{
if (fgets(input, sizeof (input), stdin) == NULL)
{
printf("Early exit\n");
exit(0);
}
printf("Read: %s", input);
fflush(stdout);
}
printf("Late exit\n");
return 0;
}
これを実行すると、上矢印キーと下矢印キーのどちらを使用しているかが正しく検出され、呼び出しendwin()
前ではなく呼び出し後に報告されます。通常、fflush()
呼び出しは必要ありませんが、終了後にラインバッファリングされるのではなく、標準出力が完全にバッファリングされるようですcurses
。これは少し驚くべきことです。(私はMac OS X 10.8.2でテストしています。)
私が使用した他のトリックは診断プリントなので、どこで何が起こっているのかがわかります。プログラムを呼び出してcurses
実行すると、画面がクリアされました。次に、上矢印(この場合)を入力してからsssddd
戻り、Control-D入力の終了(EOF)を示すために、残りの出力は次のようになりました。
$ ./curses
Up Arrow
sssddd
Read: sssddd
Early exit
$
標準出力のバッファリングを除いて、すべて期待どおりに動作しています。Late exit
このプログラムのprintステートメントにアクセスする方法はありません。