密码回显是通过c语言移动句柄的方式实现的,需要windows.h头文件,还有其他方法文末介绍
short x,short y代表句柄的位置,控制台最开始的位置是(0,0)
向右x增大,向下y增大
void tp(short x, short y) {
COORD pos = {x, y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
知道这个函数就容易了,只需要判断一些按键就能实现
以下移动句柄函数都用上面的tp表示
void star(int z) {
int n = 0; //n代表字符的个数
char t; //t代表当前输入
t = getch();
while(1) {
if(t == 13) { //以下在ASCII表里可以对照 13代表回车
if(n < 6) { //小于6个字符就提示密码过短
tp(65, 8);
printf(" "); //用空格覆盖前面
tp(65, 8);
printf("密码过短");
tp(45, z); //z是这个函数唯一的参数,代表输入密码的位置
t = getch(); //getch()接收一个字符并且不回显
continue;
}
else
break;
}
if(t == 27) //ESC
Login();
if(t < 1) { //F1-F12,上下左右,汉字等等
getch();
t = getch();
continue;
}
if(t == 8 && n == 0) { //退格但字符数为0,不进行任何操作
t = getch();
continue;
}
else if(t == 8) { //退格,减少一个星号,先用空格覆盖,再输出
tp(65, 8);
printf(" ");
tp(45, z);
printf(" ");
tp(45, z);
n--;
for(int i = 0; i < n; i++)
putch(42); //星号
t = getch();
continue;
}
if(n == 20) { //字符超过19,只出现提示
tp(65, 8);
printf(" ");
tp(65, 8);
printf("超出字数限制");
tp(45, z);
t = getch();
continue;
}
if(t == 32) { //空格
tp(65, 8);
printf(" ");
tp(65, 8);
printf("请不要输入空格");
tp(45, z);
t = getch();
continue;
}
tp(65, 8);
printf(" ");
tp(45, z);
m[n] = t;
n++; //输入限制之内的数字,字符数++
for(int i = 0; i < n; i++)
putch(42);
t = getch();
}
m[n] = 0; //末尾添上结束符
}
这样在输入的时候还能按ESC返回
如果不用移动句柄函数还能有一种方法
判断退格键之后printf("/b");
再输出一个退格键就能实现