linuxドロップダウンキーの小さな研究(続き)

1952 ワード

前回出たbackspaceは入力時に^Hの問題を表示して、グループの中の古い運転手に教えてもらって、古い運転手は、これはエコーの問題だと言って、そのechoを何か修正して、この考えに沿って、資料を調べて、上のブログはその中の1つです.
くだらないことは言わないで、直接コードを入れます.
    
#include 
#include 
#include 
#define LEN 30

struct termios oldt, newt;
void mode_off(void);
void mode_restore(void);
void get_username(char * string, int len)
{
	char ch;
	int i=0;
	mode_off();
	puts("
username:
"); while((ch=getchar())=='
'); while(ch!='
' && i=0 ) { if(ch=='\b') { string[--i]='\0'; putchar('\b'); putchar(' '); putchar('\b'); } else { string[i++]=ch; putchar(ch); } ch=getchar(); } putchar('
'); string[i]='\0'; mode_restore(); } void get_password(char * string, int len) { char ch; int i=0; mode_off(); puts("
password:
"); while((ch=getchar())=='
'); while(ch!='
' && i=0 ) { if(ch=='\b') { string[--i]='\0'; putchar('\b'); putchar(' '); putchar('\b'); } else { string[i++]=ch; putchar('*'); } ch=getchar(); } putchar('
'); string[i]='\0'; mode_restore(); } void mode_off(void) //off echo { newt=oldt; newt.c_lflag &= ~(ECHO | ICANON); tcsetattr(STDIN_FILENO, TCSANOW, &newt); } void mode_restore(void) //restore echo { tcsetattr(STDIN_FILENO, TCSANOW, &oldt); }

    mode_offはオフにして表示します.mode_restoreは元のモードに戻り、get_usernameはユーザー名を入力し、get_passwordはパスワードを入力します.構造体struct termios、tcgetattr()およびtcsetattr()については、前の記事を参照するか、自分で資料を調べます.   
エコーをオフにした後、1つを読んで1つを表示し、backspaceを読むと、カーソルが1つ戻り、スペースを入力して、元の文字を上書きし、さらに1つ後退し、さらに進みます.パスワードを入力すると、文字が入力され、*が表示されます.
これでbackspaceの問題は基本的に解決された.