printw plus scanf в окне ncurse не будет отображать напечатанный текст - PullRequest
0 голосов
/ 25 апреля 2018

Я получил эту часть моей программы, которая печатает что-то на экране бесконечно, пока пользователь не нажмет пробел и не введет какое-то значение.Я пытался вызвать echo () прямо перед первым printw, но это не сработало.Может кто-нибудь сказать мне, почему при наборе текста цена не отображается на экране или, по крайней мере, указать мне в нужном месте?Я также первоначально использовал 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 голосов
/ 26 апреля 2018

Установка для nodelay значения FALSE и вызов echo () до того, как первая printw позволила мне использовать 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;
0 голосов
/ 25 апреля 2018

Это не работает , потому что scanf читает со стандартного ввода, который переводится в raw mode с помощью ncurses (фактически любой библиотеки curses) , Вы, вероятно, имели в виду scanw, который считывает ввод с использованием библиотеки ncurses.

...