Измените ввод с консоли пользователя, когда они вводят C - PullRequest
0 голосов
/ 11 февраля 2019

Я пишу программу на C, которая принимает пользовательский ввод.Для пользовательского ввода требуются некоторые специальные символы, для которых я хочу использовать зарезервированные специальные клавиши на клавиатуре.

Для простоты предположим, что я хочу заменить любое вхождение символа \ на λ.Так что, если пользователь наберет \x.x, он увидит λx.x.

Чтобы уточнить, я не хочу, чтобы его ввод повторялся обратно с заменой \ на λ, я хочучтобы ввести \, но сразу увидеть λ в консоли.

Есть ли простой способ сделать это?


Редактировать: Поскольку, похоже, что-то вроде этого зависит от ОС, я бы хотел решение для Unix / Linux.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Есть ли простой способ сделать это?

Да, это просто с макропреобразованием readline \ в λ.Демонстрационная программа:

/* cc -lreadline */

#include <stdio.h>
#include <stdlib.h>
#include <readline/readline.h>

main()
{
    // bind the backslash key to lambda's UTF-8 code 0xCE 0xBB (cebb)
    rl_parse_and_bind((char []){"\"\\\\\":'\xCE\xBB'"});
    unsigned char *line, *cp;
    while (cp = line = readline("? "))
    {
        while (*cp) printf("%3x", *cp++); puts("");
        free(line);
    }
}

Конечно, для отображения λ.

необходим терминал с поддержкой UTF-8.
0 голосов
/ 12 февраля 2019

Я думаю, что это отличный вопрос для многих приложений!Для этого termios.h лучше, чем curses.h , на мой взгляд, потому что с termios.h вы можете вводить данные в терминал, как обычно, безТребуется полноэкранное приложение, такое как curses.Кроме того, вам не нужно компилировать с библиотекой (curses требует опции -lcurses в вашем компиляторе).Обратите внимание, что это решение требует от вас реализации собственной getch -подобной функции.Кроме того, это решение специально для Linux (AFAIK)

#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <locale.h>
#include <wchar.h>

wint_t mygetwch()
{
    // Save the current terminal details
    struct termios echo_allowed;
    tcgetattr(STDIN_FILENO, &echo_allowed);

    /* Change the terminal to disallow echoing - we don't
       want to see anything that we don't explicitly allow. */
    struct termios echo_disallowed = echo_allowed;
    echo_disallowed.c_lflag &= ~(ICANON|ECHO);
    tcsetattr(STDIN_FILENO, TCSANOW, &echo_disallowed);

    // Get a wide character from keyboard
    wint_t wc = getwchar();

    // Allow echoing again
    tcsetattr(STDIN_FILENO, TCSANOW, &echo_allowed);

    // Return the captured character
    return wc;
}

int main()
{
    // Imbue the locale so unicode has a chance to work correctly
    setlocale(LC_ALL, "");

    // Start endless loop to capture keyboard input
    while (1) {
        wint_t wc = mygetwch(); // get a wide character from stdin
        if (wc==WEOF)           // exit if that character is WEOF
            break;
        else if (wc==L'\\')     // replace all instances of \ with λ
            wprintf(L"%lc",L'λ');
        else                    // otherwise just print the character
            wprintf(L"%lc",wc);
    }
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...