這裏是一個SSCCE根據您的代碼(Short, Self-Contained, Complete Example):
#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
並返回,然後控制-d以指示輸入(EOF)的端部,和輸出的其餘部分是:
$ ./curses
Up Arrow
sssddd
Read: sssddd
Early exit
$
它是所有除了標準輸出上的緩衝之外,其行爲與我所預期的相同。在這個程序中沒有辦法到達Late exit
打印聲明。
「輸入」在哪裏定義? – templatetypedef 2013-03-12 03:36:31
@templatetypedef立即檢查 – NoNameY0 2013-03-12 03:42:23
請注意,儘管有縮進,兩個'fflush(stdout);'調用都是無條件的。你需要大括號(或逗號代替分號 - ick!)以使它們成爲有條件的。 – 2013-03-12 03:51:48