在ncurse窗口中的printw plus scanf不会显示键入的文本

时间:2018-04-25 04:34:28

标签: c ncurses

我的程序中有一部分无限期地在屏幕上打印一些内容,直到用户点击空格键并输入一些值。我尝试在第一次打印之前调用echo(),但它没有工作。任何人都可以告诉我为什么打字时,价格没有显示在屏幕上或者至少指向正确的位置?我最初也使用了scanw,但是它不会中断循环,并且已经为价格检索了一些随机值。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <ncurses.h>


int kbhit(void){
    int ch = getch();
    if (ch != ERR) {
        ungetch(ch);
        return 1;
    } else {
        return 0;
    }
}

int main()
{
    initscr();
    cbreak();
    echo();
    nodelay(stdscr, TRUE);
    scrollok(stdscr, TRUE);
    int price;

    while(1){
        printw("sleeping...\n");
        refresh();
        if (kbhit()) {
            char c = getch();
            switch (c){
                case 32:
                    printw("\nPrice in USD? ");
                    refresh();
                    scanf("%d", &price);
                    printw("\nPrice entered: %d\n",price);
                    refresh();
                    break;
            }
        }
        sleep(1);
    }
    return 0;
}

2 个答案:

答案 0 :(得分:1)

无法工作因为 scanf 从标准输入读取,该输入被放入原始模式中ncurses(实际上是任何curses库)。你可能意味着scanw,它使用ncurses库读取输入。

答案 1 :(得分:0)

将nodelay设置为FALSE并在第一个printw允许我使用scanw之前调用echo()。我只需要在scanw之后将它们设置回noecho()和nodelay = TRUE,并且一切正常。谢谢大家!

case 32:
       nodelay(stdscr, FALSE);
       echo();
       printw("\nPrice in USD? ");
       refresh();
       scanw("%d", &price);
       nodelay(stdscr, TRUE);
       noecho();
       printw("Price entered: %d\n",price);
       refresh();
       break;