linuxドロップダウンキーの小さな研究(続き)
1952 ワード
前回出たbackspaceは入力時に^Hの問題を表示して、グループの中の古い運転手に教えてもらって、古い運転手は、これはエコーの問題だと言って、そのechoを何か修正して、この考えに沿って、資料を調べて、上のブログはその中の1つです.
くだらないことは言わないで、直接コードを入れます.
mode_offはオフにして表示します.mode_restoreは元のモードに戻り、get_usernameはユーザー名を入力し、get_passwordはパスワードを入力します.構造体struct termios、tcgetattr()およびtcsetattr()については、前の記事を参照するか、自分で資料を調べます.
エコーをオフにした後、1つを読んで1つを表示し、backspaceを読むと、カーソルが1つ戻り、スペースを入力して、元の文字を上書きし、さらに1つ後退し、さらに進みます.パスワードを入力すると、文字が入力され、*が表示されます.
これでbackspaceの問題は基本的に解決された.
くだらないことは言わないで、直接コードを入れます.
#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の問題は基本的に解決された.