当用户在C中键入时更改用户控制台输入
我正在写一个接受用户输入的C程序。用户输入需要一些特殊字符,我希望在键盘上保留这些字符的特殊键 为了简单起见,假设我想用当用户在C中键入时更改用户控制台输入,c,linux,string,user-input,C,Linux,String,User Input,我正在写一个接受用户输入的C程序。用户输入需要一些特殊字符,我希望在键盘上保留这些字符的特殊键 为了简单起见,假设我想用λ替换出现的符号\。因此,如果用户键入\x.x,他们会看到λx.x 为了澄清,我不希望他们的输入被\替换为λ,我希望他们输入\,但请立即在控制台中查看λ 有没有一个简单的方法可以做到这一点 编辑:因为这似乎是特定于操作系统的,所以我想要一个unix/linux解决方案 我认为这是一个有很多应用程序的好问题!在我看来,termios.h比curses.h更好,因为使用termi
λ
替换出现的符号\
。因此,如果用户键入\x.x
,他们会看到λx.x
为了澄清,我不希望他们的输入被\
替换为λ
,我希望他们输入\
,但请立即在控制台中查看λ
有没有一个简单的方法可以做到这一点
编辑:因为这似乎是特定于操作系统的,所以我想要一个unix/linux解决方案 我认为这是一个有很多应用程序的好问题!在我看来,termios.h比curses.h更好,因为使用termios.h可以像平常一样输入到终端,而不需要像curses那样的全屏应用程序。此外,您不需要使用库进行编译(curses需要编译器中的
-lcurses
选项)。请注意,此解决方案要求您实现自己的getch
类函数。此外,此解决方案是特定于linux的(AFAIK)
#包括
#包括
#包括
#包括
#包括
wint_t mygetwch()
{
//保存当前终端详细信息
允许使用结构术语;
tcgetattr(标准输入文件号,允许回显);
/*将终端更改为不允许回声-我们不允许
希望看到任何我们不明确允许的东西*/
struct termios echo_disallowed=允许echo_;
echo_disallowed.c_lflag&=~(ICANON | echo);
tcsetattr(不允许使用标准文件号、TCSANOW和echo);
//从键盘获取宽字符
wint_t wc=getwchar();
//允许再次回音
tcSetTTR(允许标准输入文件号、TCSANOW和echo);
//返回捕获的角色
返回wc;
}
int main()
{
//插入区域设置,使unicode有机会正确工作
setlocale(LC_ALL,“”);
//启动无限循环以捕获键盘输入
而(1){
wint_t wc=mygetwch();//从stdin获取宽字符
if(wc==WEOF)//如果该字符是WEOF,则退出
打破
else if(wc==L'\\')//将\的所有实例替换为λ
wprintf(L“%lc”,L‘λ’);
else//否则只需打印字符
wprintf(L“%lc”,wc);
}
返回0;
}
我认为对于许多应用程序来说,这是一个很好的问题!在我看来,termios.h比curses.h更好,因为使用termios.h可以像平常一样输入到终端,而不需要像curses那样的全屏应用程序。此外,您不需要使用库进行编译(curses需要编译器中的-lcurses
选项)。请注意,此解决方案要求您实现自己的getch
类函数。此外,此解决方案是特定于linux的(AFAIK)
#包括
#包括
#包括
#包括
#包括
wint_t mygetwch()
{
//保存当前终端详细信息
允许使用结构术语;
tcgetattr(标准输入文件号,允许回显);
/*将终端更改为不允许回声-我们不允许
希望看到任何我们不明确允许的东西*/
struct termios echo_disallowed=允许echo_;
echo_disallowed.c_lflag&=~(ICANON | echo);
tcsetattr(不允许使用标准文件号、TCSANOW和echo);
//从键盘获取宽字符
wint_t wc=getwchar();
//允许再次回音
tcSetTTR(允许标准输入文件号、TCSANOW和echo);
//返回捕获的角色
返回wc;
}
int main()
{
//插入区域设置,使unicode有机会正确工作
setlocale(LC_ALL,“”);
//启动无限循环以捕获键盘输入
而(1){
wint_t wc=mygetwch();//从stdin获取宽字符
if(wc==WEOF)//如果该字符是WEOF,则退出
打破
else if(wc==L'\\')//将\的所有实例替换为λ
wprintf(L“%lc”,L‘λ’);
else//否则只需打印字符
wprintf(L“%lc”,wc);
}
返回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);
}
}
/*cc-lreadline*/
#包括
#包括
#包括
main()
{
//将反斜杠键绑定到lambda的UTF-8代码0xCE 0xBB(cebb)
rl\u parse\u和\u bind((char[]){“\”:“\xCE\xBB'”});
无符号字符*行,*cp;
而(cp=line=readline(“?”)
{
而(*cp)printf(“%3x”,*cp++);put(“”);
自由线;
}
}
当然,显示λ
需要启用UTF-8的终端
有没有一个简单的方法可以做到这一点
是的,将宏映射到很容易。演示程序:
/* 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);
}
}
/*cc-lreadline*/
#包括
#包括
#包括
main()
{
//将反斜杠键绑定到lambda的UTF-8代码0xCE 0xBB(cebb)
rl\u parse\u和\u bind((char[]){“\”:“\xCE\xBB'”});
无符号字符*行,*cp;
而(cp=line=readline(“?”)
{
而(*cp)printf(“%3x”,*cp++);put(“”);
自由线;
}
}
当然,显示
λ
需要一个启用UTF-8的终端,这并不容易,不,但这是可能的。如何做到这一点在很大程度上取决于终端和操作系统,因此请至少为操作系统添加标记。不使用标准C。您将需要类似于诅咒
库的东西。因此,这是一个系统编程问题。是的。一般来说,它是通过读取输入来完成的,终端不会回显输入。然后在程序中进行回音,然后可以用任何合适的符号替换特殊键。然后对Linux进行研究