在输入均匀之前,变量随机变为空

时间:2013-03-12 03:34:33

标签: c ncurses

所以,这是我的问题。我正在使用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();

2 个答案:

答案 0 :(得分: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并返回,然后 Control-D 表示输入结束(EOF),其余输出为:< / p>

$ ./curses

Up Arrow
sssddd
Read: sssddd
Early exit
$

除了标准输出上的缓冲之外,它的行为正如我所期望的那样。没有办法在此程序中找到Late exit print语句。

答案 1 :(得分:-2)

如上所述输入未定义。此外,fgets用于文件输入流,而不是用于读取std输入流。 (改用使用获取)