Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当用户在C中键入时更改用户控制台输入_C_Linux_String_User Input - Fatal编程技术网

当用户在C中键入时更改用户控制台输入

当用户在C中键入时更改用户控制台输入,c,linux,string,user-input,C,Linux,String,User Input,我正在写一个接受用户输入的C程序。用户输入需要一些特殊字符,我希望在键盘上保留这些字符的特殊键 为了简单起见,假设我想用λ替换出现的符号\。因此,如果用户键入\x.x,他们会看到λx.x 为了澄清,我不希望他们的输入被\替换为λ,我希望他们输入\,但请立即在控制台中查看λ 有没有一个简单的方法可以做到这一点 编辑:因为这似乎是特定于操作系统的,所以我想要一个unix/linux解决方案 我认为这是一个有很多应用程序的好问题!在我看来,termios.h比curses.h更好,因为使用termi

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

为了简单起见,假设我想用
λ
替换出现的符号
\
。因此,如果用户键入
\x.x
,他们会看到
λx.x

为了澄清,我不希望他们的输入被
\
替换为
λ
,我希望他们输入
\
,但请立即在控制台中查看
λ

有没有一个简单的方法可以做到这一点



编辑:因为这似乎是特定于操作系统的,所以我想要一个unix/linux解决方案

我认为这是一个有很多应用程序的好问题!在我看来,termios.hcurses.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.hcurses.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进行研究