2013-03-12 23 views
0

所以,這是我的問題。我使用的是ncurses,當我按下向上或向下按鈕時,它會顯示向上的箭頭,所以我希望進入我的while循環,並進一步輸入。問題是,這個過程中的變量輸入變爲NULL並且它存在。這是爲什麼?我想要的是打印或向下箭頭,程序正常進行。變量在輸入前被隨機變爲空

int ch; 
char input[100]; 
initscr(); 
raw(); 
keypad(stdscr, TRUE); 
noecho(); 
ch = getch(); 
if(ch== KEY_UP) 
    printf("\nUp Arrow"); fflush(stdout); 

if(ch== KEY_DOWN) 
    printf("\ndown Arrow");fflush(stdout); 

endwin(); 
+1

「輸入」在哪裏定義? – templatetypedef 2013-03-12 03:36:31

+0

@templatetypedef立即檢查 – NoNameY0 2013-03-12 03:42:23

+0

請注意,儘管有縮進,兩個'fflush(stdout);'調用都是無條件的。你需要大括號(或逗號代替分號 - ick!)以使它們成爲有條件的。 – 2013-03-12 03:51:48

回答

1

這裏是一個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打印聲明。

+0

我是一個使用Mac,netbeans,並且我得到了提前退出。 向上箭頭 提前退出 成功運行(總時間:1秒) – NoNameY0 2013-03-12 04:39:55

+0

我不知道如何使用NetBeans - 比我做的XCode或者Eclipse了。我沒有解釋你爲什麼立即獲得「提前退出」。我不認爲你使用的終端程序應該是一個因素(但我使用'/ Applications/Utilities/Terminal')。我不認爲shell應該是一個因素(但是我使用'/ bin/sh',又名'bash')。如果您在NetBeans中編譯並從終端直接運行,會發生什麼情況? – 2013-03-12 04:47:01

+0

在bash中也有相同的錯誤。我只是放棄了。 :( – NoNameY0 2013-03-12 04:53:13

-2

如上所述,輸入未定義。另外,fgets用於文件輸入流,不用於讀取std輸入流。 (使用gets代替)

+2

從'man gets':'不要使用gets()。因爲事先不知道數據是不可能的,因爲get()會讀取多少個字符,並且gets()會繼續存儲超過緩衝區,使用起來非常危險,已經被用來破壞計算機的安全,改用fgets()。「 – 2013-03-12 03:53:50

+1

是的,你說得對。我完全忘了gets()沒有強制執行邊界。所以,聽聽上面的人不要使用gets()。 – ByteByter 2013-03-12 07:15:41