刷新()应该在哪里使用ncurses

Where should refresh() be using ncurses?

本文关键字:ncurses 在哪里 刷新      更新时间:2023-10-16

下面的代码在启动时不输出任何内容。当我键入 1,2,3 时,它会打印以下内容:

1Enter the value of argv[1]:49
2Enter the value of argv[2]:50
3Enter the value of argv[3]:51

我对使用循环时应该将 刷新() 放在哪里感到非常困惑。我正在尝试实现类似于 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;
}

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

int n = getch() - '0';

请注意,这仅适用于数字(0 到 9)。如果您输入任何其他内容,它不会给您预期的答案,因此您可能希望在那里添加其他检查。

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

首先做你的printw()在屏幕缓冲区中放置一些东西,然后做你的refresh()使修改后的屏幕缓冲区可见,然后做getch()

您可以使用 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;
}

不需要显式调用refresh,因为getch会执行刷新,如手册页中所述:

如果窗口不是键盘,并且自上次调用 wrefresh 以来已被移动或修改,则在读取另一个字符之前将调用 wrefresh

如前所述,该程序似乎没有显示任何内容,因为最初诅咒处于cooked模式。 在调用initscr之后添加对cbreaknoecho的调用将允许输入单个字符(同样,请参阅ncurses的手册页)。

通过这些更改,还有一个问题:不会显示最后一个printw。 在endwin()之前放一个getch()可以解决这个问题。