当前位置:  开发笔记 > 运维 > 正文

ANSI C无回声键盘输入

如何解决《ANSIC无回声键盘输入》经验,为你挑选了2个好方法。

我一直在谷歌搜索没有运气.我正在寻找一种方法来做getc()或gets()或任何不回应终端的方法.我看到了kbhit(),但这似乎不是ANSI的一部分.理想情况下,我希望代码看起来像

char s[100];
no_echo_gets(s); /* Won't echo to screen while being typed */
printf("%s\n", s);

有没有人知道一个良好的ANSI兼容的方式来做到这一点?



1> dwc..:

对于类UNIX系统,您希望使用ECHO标志...

#include 
...
struct termios t;
tcgetattr(fd, &t);
t.c_lflag &= ~ECHO;
tcsetattr(fd, TCSANOW, &t);
...


t.c_lflag | = ~ECHO应该是t.c_lflag&= ~ERCH

2> Edward A Kim..:

getpass命令存在于Linux中.但你可以制作一个更漂亮的版本,单独的系统回声不会消除对enter命令的需要,而击倒缓冲并不会在数据输入后杀死carraige返回的产生.将两者结合起来可以很好地逼近一个安静的入口.您可以添加星号以提供秘密条目外观,因此以下是两个建议的组合:

    #include 
    #include 
    #include 
    int getche(void);
    int main(int argc, char **argv){
    int i=0;       
    char d,c='h',s[6];
    printf("Enter five secret letters\n");
    s[5]='\0'; //Set string terminator for string five letters long
    do{
      d=getche();//Fake getche command silently digests each character
    printf("*");
      s[i++]=d;} while (i<5);
    printf("\nThank you!!\n Now enter one more letter.\n");
    c=getchar();
    printf("You just typed %c,\nbut the last letter of your secret string was %c\n",c,d);   
    printf("Your secret string was: %s\n",s);   
        return 0;
    }
    /* reads from keypress, echoes */
        int getche(void)
        {
            struct termios oldattr, newattr;
            int ch;
            tcgetattr( STDIN_FILENO, &oldattr );
            newattr = oldattr;
            newattr.c_lflag &= ~( ICANON | ECHO);\\knock down keybuffer
            tcsetattr( STDIN_FILENO, TCSANOW, &newattr );
            system("stty -echo");\\shell out to kill echo
            ch = getchar();
            system("stty echo");
            tcsetattr( STDIN_FILENO, TCSANOW, &oldattr );
            return ch;
        }


-1尝试缩进代码并使用`//`作为注释.``\\``不编译.
推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有