键入C

时间:2019-02-11 19:24:47

标签: c linux string user-input

我正在编写一个需要用户输入的C程序。用户输入需要一些特殊字符,我希望在键盘上保留特殊键。

为简单起见,假设我希望将出现的任何符号\替换为λ。这样,如果用户键入\x.x,他们就会看到λx.x

为澄清起见,我不希望将他们的输入用\替换为λ,而是希望他们输入\,但请参阅λ立即在控制台中。

有一种简单的方法吗?


编辑:由于似乎这是特定于OS的,所以我想要一个Unix / Linux解决方案。

2 个答案:

答案 0 :(得分:0)

我认为对于许多应用程序来说这是一个很大的问题!为此,我认为 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;
}

答案 1 :(得分:0)

  

有一种简单的方法吗?

是的,使用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的终端。