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();
4

2 に答える 2

1

コードに基づく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ステートメントにアクセスする方法はありません。

于 2013-03-12T04:34:59.003 に答える
-2

述べたように、入力は未定義です。また、fgetsは、std入力ストリームの読み取りではなく、ファイル入力ストリームに使用されます。(代わりにgetsを使用してください)

于 2013-03-12T03:45:35.130 に答える