refresh()应该在哪里使用ncurses?

时间:2013-09-04 08:39:03

标签: c++ linux loops ncurses

我的代码在启动时输出没有任何内容。当我输入1,2,3:

时,它会打印以下内容
1Enter the value of argv[1]:49
2Enter the value of argv[2]:50
3Enter the value of argv[3]:51

我很困惑在使用循环时应该放置refresh()的位置。我正在努力实现像for循环中的注释。

int main()
{
    initscr();
    int argv[3];
    int argvLen = sizeof(argv)/sizeof(*argv);

    for (int i=0; i<argvLen; i++)
    {
        int n = getch();
        printw("Enter value of argv[%d]: %d \n", i+1, n);
        argv[i] = n;
        refresh();

        //cout << "Enter value of argv[" << i+1 << "]:" << endl;
        //cin >> argv[i];
    }

    endwin();
    return 0;
}

4 个答案:

答案 0 :(得分:0)

getch()会返回一个字符,例如'1''2''3'。这些的整数值是49,50,51。如果需要整数值,则应减去'0'

int n = getch() - '0';

请注意,这仅适用于数字(0到9)。如果你输入任何其他东西,它将无法给你预期的答案,所以你可能想在那里添加额外的支票。

答案 1 :(得分:0)

假设您处于延迟模式,getch()将阻止等待用户输入。

首先执行您的printw()将某些内容放入屏幕缓冲区,然后执行refresh()以使修改后的屏幕缓冲区可见,然后执行getch()

答案 2 :(得分:0)

您可以使用scanf和相关函数来读取整数值。

int main()
{
    int i;
    int values[3];
    int valuesLen = sizeof(values)/sizeof(*values);

    for (i=0; i<valuesLen; i++)
    {
        printf("Enter value of values[%d]: ", i+1);
        scanf("%d", &values[i]);
        printf("Value of values[%d]: %d \n", i+1, values[i]);                
    }

    return 0;
}

答案 3 :(得分:0)

不需要明确调用refresh,因为getch会进行刷新,如manual page中所述:

如果窗口不是打击垫,并且自上次调用 wrefresh 后移动或修改了该窗口,则在读取另一个字符之前将调用 wrefresh 。 / p>

如上所述,程序似乎没有显示任何内容,因为最初的curses处于cooked模式。在调用cbreak后添加对noechoinitscr的来电将允许输入单个字符(再次,请参阅manual page了解ncurses)。

通过这些更改,还有一个问题:最后printw将不会显示。在getch()之前放置一个endwin()即可修复。