Проблема с передачей ключа ESCAPE в буфер стандартного ввода в консоли C Windows - PullRequest
0 голосов
/ 10 апреля 2019

Я хочу поместить текст в мою строку и обработать его в бесконечном цикле, но я хочу разорвать цикл, если первым символом ввода является клавиша ESCAPE, но getchar возвращает 10, когда я нажимаю ESCAPE, а затем ENTER , printf правильно печатает введенный символ, но если я нажму ESCAPE, ничего не произойдет. Я также не хочу использовать _getch() или getche(), которые фактически решат мою проблему, но они также удаляют c из буфера и не отображают его должным образом. Что я могу сделать?

int c;
while( 1 )
{
    c = getchar();
    printf( "c = %d\n", c );   // just for debug
    if( c == 27 ) break;
    else ungetc( c, stdin );
    fgets( StrIn, BUF_SIZE - 1, stdin );
    // REST OF CODE ********
}

РЕДАКТИРОВАТЬ Я только что нашел функцию Microsoft

if( GetAsyncKeyState( VK_ESCAPE ) )
        break;

это прекрасно работает для меня. Спасибо за чтение и за ваше время, моя проблема решена.

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

, если вы используете Windows - используйте также функции, специфичные для Windows. В моей функции ESC отменяет ввод.

char *wingetsn(char *str, size_t maxlen)
{
    size_t len = 0;
    int ch;
    int exit = 0;

    while (len < maxlen - 1 && !exit)
    {
        while(!_kbhit());
        switch((ch = _getch()))
        {
            case 27:
                str[0] = 0;
                exit = 1;
                break;
            case '\r':
                exit = 1;
                break;
            case '\n':
                break;
            default:
                printf("%c", ch);
                str[len++] = ch;
                break;
        }
    }
    str[len++] = 0;
    return str;
}
0 голосов
/ 10 апреля 2019

Нажатие клавиши ESCAPE на клавиатуре обычно не отправляет символ ESCAPE на консоль, приложение или ОС часто обрабатывают символ и не передают его. Я бы использовал другой символ для обозначения факта, который вы хотите разбить, например '~'.

Когда вы говорите, что он отображается неправильно, если вы удаляете c из буфера, возможно, вы можете просто добавить первый символ в буфер вручную.

Добавить макрос для символа разрыва

#define BREAK_CHAR '~'

Спинет кода может выглядеть следующим образом:

int c;
while(1)
{
    c = getchar();

    /* check if we should break */
    if(c == BREAK_CHAR)
        break;

    /* assign the first character that was already read in */
    StrIn[0] = c;

    /* get the rest of the string */
    fgets( StrIn + 1, BUF_SIZE - 2, stdin );

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...