我正在使用cplusplus中的一段代码,而我不明白为什么这段代码只是跳过了输入部分的密码,而只是跳到了EMAIL的输入。
//function to mask the input for password
string getpass(const char *prompt, bool show_asterisk=true)
{
const char BACKSPACE=127;
const char RETURN=10;
string password;
unsigned char ch=0;
//cout <<prompt<<endl;
while((ch=getch())!=RETURN)
{
if(ch==BACKSPACE)
{
if(password.length()!=0)
{
if(show_asterisk)
cout <<"\b \b";
password.resize(password.length()-1);
}
}
else
{
password+=ch;
if(show_asterisk)
cout <<'*';
}
}
cout <<endl;
return password;
}
在这里,我将此函数称为:
void AgendaUI::userRegister(void)
{
string name, password, email, phone;
//cout << "\n[register] [username] [password] [email] [phone]" << endl;
cout << "\n[regist]";
cout << "\n[username] ";
cin >> name;
cout << "[password] ";
password = getpass("Enter the password",true);
cout << "\n[email] ";
cin >> email;
cout << "[phone] ";
cin >> phone;
}
答案 0 :(得分:3)
因为当用户输入用户名时,他们还输入了 Enter 字符(这就是终端知道提交该行的方式)。 cin >> name
未读取此字符,该字符仍在缓冲区中。然后,getpass
将其读取为第一个字符,然后立即停止。
请注意,您的代码与文章的代码不同,后者不要求用户名,并且显示getpass
相当脆弱(例如,在简单地添加您添加的基本代码时,它就会中断,并且似乎依赖于您悄悄删除的
您可以通过adding cin.ignore(256, '\n')
after cin >> name
来解决此问题,尽管坦率地说这有点麻烦,而使用std::getline
提取用户名可能更好。