I tried hard to use the first method of
密码输入关闭回显的两种方法 , which is named ncurses, the user interaction is very bad. the second method is better and works fine.
A piece of code is ready to use:
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <ctype.h>
int mygetch ( void )
{
int ch;
struct termios oldt, newt;
tcgetattr ( STDIN_FILENO, &oldt );
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr ( STDIN_FILENO, TCSANOW, &newt );
ch = getchar();
tcsetattr ( STDIN_FILENO, TCSANOW, &oldt );
return ch;
}
int main()
{
int ch;
char pword[BUFSIZ];
int i = 0;
puts ("Enter your password");
fflush(stdout);
while ((ch = mygetch()) != EOF
&& ch != '/n'
&& ch != '/r'
&& i < sizeof(pword) - 1)
{
if (ch == '/b' && i > 0)
{
printf("/b /b");
fflush(stdout);
i--;
pword[i] = '/0';
}
else if (isalnum(ch))
{
putchar('*');
pword[i++] = (char)ch;
}
}
pword[i] = '/0';
printf ("/nYou entered >%s</n", pword);
return 0;
}
A piece of code is ready to use:
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <ctype.h>
int mygetch ( void )
{
int ch;
struct termios oldt, newt;
tcgetattr ( STDIN_FILENO, &oldt );
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr ( STDIN_FILENO, TCSANOW, &newt );
ch = getchar();
tcsetattr ( STDIN_FILENO, TCSANOW, &oldt );
return ch;
}
int main()
{
int ch;
char pword[BUFSIZ];
int i = 0;
puts ("Enter your password");
fflush(stdout);
while ((ch = mygetch()) != EOF
&& ch != '/n'
&& ch != '/r'
&& i < sizeof(pword) - 1)
{
if (ch == '/b' && i > 0)
{
printf("/b /b");
fflush(stdout);
i--;
pword[i] = '/0';
}
else if (isalnum(ch))
{
putchar('*');
pword[i++] = (char)ch;
}
}
pword[i] = '/0';
printf ("/nYou entered >%s</n", pword);
return 0;
}