Как получить чар в любой момент в программе, чтобы закрыть его? - PullRequest
0 голосов
/ 30 января 2020

У меня есть простая программа, которую я хочу закрыть сразу после нажатия клавиши возврата (или любой другой клавиши). Но я не хочу ничего сканировать между кодами. Вот код:

int main()
{
    int x;
    puts("hello");
    puts("hi");
    f1();
    scanf("%d", &x);
    f2();
    printf("%d",x);
}

void f1() {
...
}
void f2() {
...
}

1 Ответ

0 голосов
/ 22 марта 2020

Следующее решение относится только к платформе Microsoft Windows, поскольку вопрос был помечен как "windows". Решение также может работать на других платформах, но это не гарантируется, поскольку оно использует функции, которые не являются частью официального стандарта ISO C.

Вы можете использовать функцию _kbhit, чтобы определить, была ли нажата клавиша. Если эта функция возвращает ненулевое значение, указывающее, что нажатие клавиши ожидает во входном буфере, вы можете вызвать функцию _getch или _getche без риска блокировки функции. Затем вы можете сравнить возвращенный символ с символом возврата '\b', чтобы определить, была ли нажата клавиша возврата.

Однако в вашем случае использование этих функций для проверки нажатия клавиши возврата не будет работать вместе с scanf по двум причинам:

  1. Согласно этой странице из официальной документации Microsoft , функции консольного ввода-вывода не совместимы с функциями потокового ввода-вывода (* 1021) *, scanf, et c.)
  2. Функциональный вызов scanf заблокирует весь поток в ожидании ввода пользователем целого числа и нажмите ENTER .

Поэтому было бы лучше прочитать каждый символ один за другим с консоли с помощью _getche, проверить, является ли это символом возврата, и, если нет, записать его в свой собственный входной буфер. После того, как пользователь нажмет ENTER , вы можете преобразовать содержимое буфера в число, используя strtol, atoi или sscanf.

Я изменил ваш код на следующий: sh this:

#include <stdlib.h>
#include <conio.h>

int main()
{
    const int MAX_INPUT = 80;
    char input_buffer[MAX_INPUT + 1];
    char c;
    int i;

    int x;

    _cputs( "hello\n" );
    _cputs( "hi\n" );

    f1();

    //this finite loop prevents a buffer overrun
    for ( i = 0; i < MAX_INPUT; i++ )
    {
        c = _getche();

        //when using console I/O functions, we must check
        //for carriage return '\r' instead of newline '\n'
        if ( c == '\r' ) break;

        if ( c == '\b' ) return 0;

        input_buffer[i] = c;
    }

    input_buffer[i] = '\0';

    //we must print a newline '\n' after encountering a 
    //carriage return '\r', because _getche does not echo it
    _cprintf( "\n" );

    // NOTE:
    // Using the function strtol instead of atoi allows you
    // to check if an error occured while converting.
    x = atoi( input_buffer );

    f2();

    _cprintf( "%d", x );

    return 0;
}

Поскольку, как уже упоминалось, функции ввода-вывода консоли не совместимы с потоком I Функции ввода / вывода, я также заменил функции puts и printf версиями консоли _cputs и _cprintf.

Обратите внимание, что этот код не будет компилироваться, потому что, как и ваш исходный код, он содержит два вызова функций для необъявленных функций. Однако, если вы удалите эти два вызова функций, мой опубликованный код скомпилируется и будет работать правильно (по крайней мере, в моей системе).

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