我正在编写一个需要用户输入的C程序。用户输入需要一些特殊字符,我希望在键盘上保留特殊键。
为简单起见,假设我希望将出现的任何符号\
替换为λ
。这样,如果用户键入\x.x
,他们就会看到λx.x
。
为澄清起见,我不希望将他们的输入用\
替换为λ
,而是希望他们输入\
,但请参阅λ
立即在控制台中。
有一种简单的方法吗?
编辑:由于似乎这是特定于OS的,所以我想要一个Unix / Linux解决方案。
答案 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)
有一种简单的方法吗?
/* 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的终端。