Есть ли способ получить текст как можно быстрее, не дожидаясь перевода строки? - PullRequest
0 голосов
/ 01 ноября 2009

Я использую C. Я написал очень simpe программу, которая печатает обратно ввод, используя getchar () и putchar () или printf (). Есть ли способ сделать это так, как только пользователь наберет один ключ, программа зарегистрирует его, не дожидаясь ввода? Позвольте мне показать:

В настоящее время, если пользователь вводит «abc», а затем нажимает Enter, программа печатает «abc» и символ новой строки и продолжает ждать ввода. Я хочу сделать это так, как только пользователь наберет «а», программа напечатает «а» и ждет большего ввода. Я не уверен, должно ли это быть сделано внутри исходного кода или что-то должно быть изменено в командной строке Windows.

На всякий случай вот исходный код:

#include <stdio.h>

int main()
{
    int c;

    while ((c = getchar()) != EOF) {
        putchar(c);
    }
    return 0;
}

Ответы [ 4 ]

3 голосов
/ 01 ноября 2009

если вы используете Visual Studio, есть библиотека с именем conio (#include <conio.h>), которая определяет функцию kbhit () и getch ().

в противном случае в Windows все еще существует возможность использования функций из Windows SDK (ReadConsoleInput () и т. П.), Но для этого потребуется немного больше кода (хотя, когда все сделано и, если все сделано правильно, это может использовать повторно в любое время, когда захотите)

1 голос
/ 01 ноября 2009

Если вы используете Visual Studio, вы можете использовать getch().

0 голосов
/ 01 ноября 2009

В Linux вы можете захватить терминал:

#include <stdio.h>
#include <ctype.h>
#include <termios.h>

system("stty raw"); /* raw output to terminal, direct feedback */
system("clear"); /* clear screen */

printf("Press a key");
answer = getchar();

system("stty cooked"); /* revert back*/
0 голосов
/ 01 ноября 2009

В этом простом случае другие ответы вам вполне подойдут.

Общее решение - отключить буферизацию строки. Это зависит от конкретной консоли; следующий пример только для Windows (не проверено):

#include <windows.h>

int main() {
    HANDLE hConsole = GetStdHandle(STD_INPUT_HANDLE);
    DWORD mode;
    GetConsoleMode(hConsole, &mode);
    SetConsoleMode(hConsole, mode & ~ENABLE_LINE_INPUT);
    // ...
}

Я предполагаю, что стандартные функции библиотеки C реализованы в терминах ReadConsole и друзей; если нет, это может даже не сработать. (Я в настоящее время на Linux, поэтому я не могу проверить это.)

...