我正在为我的项目制作一个登录表单,但我不能继续这个。我希望我的程序在按下退格按钮时删除一个字符(密码),但程序没有读取它。
这是我的代码
string username, password, power;
char ast=' ';
int aste = 0, accessLevel;
ofstream addAcc;
addAcc.open("Accounts.txt");
cout<<"Username: ";cin.ignore();getline(cin, username);
cout<<"Password: ";
do
{
ast = getch();
if (ast == 13 || ast == ' ' )
{
break;
}
if(ast==8 || password!="")
{
cout<<"\b \b";
password.erase(password.size()-1);
}
cout<<"*";
password+=ast;
aste ++;
}while(ast!=13 || ast!=' ');
do
{
cout<<"Enter Access Level(0-1): ";cin>>accessLevel;
switch(accessLevel)
{
case 0:
{
power = "Cashier";
break;
}
case 1:
{
power = "Manager";
break;
}
default:
cout<<"Invalid access level."<<endl;
}
}while(accessLevel>1||accessLevel<0);
感谢那些愿意帮助的人。
答案 0 :(得分:2)
在某些平台上getch()
将在您按BACKSPACE时返回DEL字符(ascii 127)。所以改变你的行
if(ast==8 || password!="")
到
if((ast==8 || ast==127) && !password.empty())
每次password
也不是空字符串时,您可能不想删除字符,因此我也从条件中删除了|| password!=""
。相反,如果密码不为空,则只想删除一个 字符。因此,您需要&&
而不是||
。
另请注意,您正无条件地添加getch()
返回的字符。因此,如果用户输入BACKSPACE,则删除最后一个字符,但将BACKSPACE附加到密码。所以你应该只追加getch()
返回的字符,如果它不是BACKSPACE(或DEL)。
因此,您的代码可能如下所示:
if((ast==8 || ast==127) && !password.empty())
{
cout<<"\b \b";
password.erase(password.size()-1);
aste--;
}
else
{
password+=ast;
cout<<"*";
aste++;
}
答案 1 :(得分:0)
DO { c = _getch();
if (c == 13 || c == ' ') // checking ascii key 13 pressed or no
{
break;
}
if (c == 8 || c == 127)
{
if (Password.size() != 0){
cout << "\b \b";
Password.erase(Password.size() - 1);
StarNum--;
}
}
else {
Password += c;
cout << "*";
StarNum++;
}
} while (c != 13 || c != ' ');
答案 2 :(得分:-1)
使用
#include <conio.h>
和
ch = _getch();
而不是ch = getch();
并且还改变了这样的条件
if(ch == 8)
{
password.erase(password.size()-1);
aste--;
}else
{
password +=ch;
aste++;
}