隐藏回显

来源:互联网 发布:数据库中修改语句 编辑:程序博客网 时间:2024/05/18 16:14

使用termios结构的密码程序

#include <termios.h>  #include <stdio.h>  #include <stdlib.h>  #define PASSWORD_LEN 8  int main()  {      struct termios initialrsettings, newrsettings;      char password[PASSWORD_LEN + 1];      tcgetattr(fileno(stdin), &initialrsettings);      newrsettings = initialrsettings;      newrsettings.c_lflag &= ~ECHO;      printf("Enter password: ");      if(tcsetattr(fileno(stdin), TCSAFLUSH, &newrsettings) != 0) {          fprintf(stderr,"Could not set attributes\n");      }      else {          fgets(password, PASSWORD_LEN, stdin);          tcsetattr(fileno(stdin), TCSANOW, &initialrsettings);          fprintf(stdout, "\nYou entered %s\n", password);      }      exit(0);  }  

读取每一个字符

#include <stdio.h>  #include <unistd.h>  #include <stdlib.h>  #include <termios.h>  char *menu[] = {      "a - add new record",      "d - delete record",      "q - quit",      NULL,  };  int getchoice(char *greet, char *choices[], FILE *in, FILE *out);  int main()  {      int choice = 0;      FILE *input;      FILE *output;      struct termios initial_settings, new_settings;      if (!isatty(fileno(stdout))) {          fprintf(stderr,"You are not a terminal, OK.\n");      }      input = fopen("/dev/tty", "r");      output = fopen("/dev/tty", "w");      if(!input || !output) {          fprintf(stderr, "Unable to open /dev/tty\n");          exit(1);      }      tcgetattr(fileno(input),&initial_settings);      new_settings = initial_settings;      new_settings.c_lflag &= ~ICANON;      new_settings.c_lflag &= ~ECHO;      new_settings.c_cc[VMIN] = 1;      new_settings.c_cc[VTIME] = 0;      new_settings.c_lflag &= ~ISIG;      if(tcsetattr(fileno(input), TCSANOW, &new_settings) != 0) {          fprintf(stderr,"could not set attributes\n");      }      do {          choice = getchoice("Please select an action", menu, input, output);          printf("You have chosen: %c\n", choice);      } while (choice != 'q');      tcsetattr(fileno(input),TCSANOW,&initial_settings);      exit(0);  }  int getchoice(char *greet, char *choices[], FILE *in, FILE *out)  {      int chosen = 0;      int selected;      char **option;      do {          fprintf(out, "Choice: %s\n",greet);          option = choices;          while(*option) {              fprintf(out, "%s\n",*option);              option++;          }          do {              selected = fgetc(in);          } while (selected == '\n' || selected == '\r');          option = choices;          while(*option) {              if(selected == *option[0]) {                  chosen = 1;                  break;              }              option++;          }          if(!chosen) {              fprintf(out, "Incorrect choice, select again\n");          }      } while(!chosen);      return selected;  }
示例1:关闭终端回显,键盘输入的字符不会在终端窗口显示。> #include <stdio.h>> #include <stdlib.h>> #include <termios.h>> #include <unistd.h>int main(void){struct termios ts,ots;char passbuf[1024];tcgetattr(STDIN_FILENO,&ts); /* STDIN_FILENO的值是1,表示标准输入的文件描述符 */ots = ts;ts.c_lflag &= ~ECHO; /* 关闭回终端回显功能*/ts.c_lflag |= ECHONL;tcsetattr(STDIN_FILENO,TCSAFLUSH,&ts); /* 应用新终端设置 */fgets(passbuf,1024,stdin); /* 输入字符不会在终端显示 */printf("you input character = %s/n",passbuf);tcsetattr(STDIN_FILENO,TCSANOW,&ots); /* 恢复旧的终端设备 */}示例2:自定义的不带回显的mygetch()函数。int mygetch(){        int ch;        struct termios oldt,newt;        tcgetattr(STDIN_FILENO,&oldt);        newt = oldt;        newt.c_lflag &= ~(ICANON | ECHO);        tcsetattr(STDIN_FILENO,TCSANOW,&nowt);        ch = getchar();         tcsetattr(STDIN_FILENO,TCSANOW,&oldt);    return ch;}
0 0
原创粉丝点击