#include <iostream>
#include <string>
using namespace std;
// 输入密码函数
void process_password(std::string& password);
// 测试函数
int main()
{
string pw;
if(process_password(pw))
return -1;
cout << pw << endl;
}
void process_backspace(char pw[], int& cursor, int& length)
{
if (cursor == 0)
return;
if (cursor > length)
{
--cursor;
std::cout << "\b \b";
return;
}
for (int i = 0; i < length - cursor; ++i)
{
std::cout << '*';
pw[cursor + i - 1] = pw[cursor + i];
}
std::cout << "\b ";
--cursor;
for (int i = 0; i < length - cursor; ++i)
std::cout << '\b';
--length;
}
inline bool process_arrow_key(char pw[], int& cursor, int& length)
{
switch (_getch())
{
case 71:
for (int i = 0; i < cursor; ++i)
std::cout << '\b';
cursor = 0;
break;
case 75:
if (cursor > 0)
{
--cursor;
std::cout << '\b';
}
break;
case 77:
if (cursor < length)
{
++cursor;
std::cout << '*';
}
break;
case 79:
for (int i = cursor; i < length; ++i)
std::cout << '*';
cursor = length;
break;
case 83:
std::cout << '*';
process_backspace(pw, ++cursor, length);
if (cursor != length)
std::cout << '\b';
break;
default:
std::cout << "\nInvalid input!" << std::endl;
return true;
}
return false;
}
inline void process_pw_key(char pw[], int& cursor, int& length, char input)
{
if (length < 99)
{
for (int i = length; i > cursor; --i)
{
std::cout << '*';
pw[i] = pw[i - 1];
}
std::cout << '*';
for (int i = length; i > cursor; --i)
std::cout << '\b';
pw[cursor] = input;
++cursor;
++length;
}
}
bool process_password(std::string& password, std::string& user, std::string& database) {
std::cout << "Please input password: ";
char temp[100];
int cursor = 0;
int length = 0;
bool flag = true;
while (cursor < 100 && flag)
{
char input = _getch();
switch (input)
{
case '\n':
case '\r': // enter
temp[length] = '\0';
flag = false;
break;
case '\b': // backspcae
process_backspace(temp, cursor, length);
break;
case '\3': // ctrl + c
return true;
break;
case '\0':
case -32: // left arrow, right arror key, delete
if (process_arrow_key(temp, cursor, length))
return true;
break;
default:
process_pw_key(temp, cursor, length, input);
}
}
std::cout << std::endl;
temp[length] = '\0';
password = temp;
return false;
}
测试结果:
按顺序输入:1,2,3,home,4,5,6,end,7,8,9。