输入缓冲和屏蔽密码输入C ++

时间:2018-11-30 16:25:08

标签: c++ passwords masking

我正在使用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;
}  

Terminal

1 个答案:

答案 0 :(得分:3)

因为当用户输入用户名时,他们还输入了 Enter 字符(这就是终端知道提交该行的方式)。 cin >> name未读取此字符,该字符仍在缓冲区中。然后,getpass将其读取为第一个字符,然后立即停止。

请注意,您的代码与文章的代码不同,后者不要求用户名,并且显示getpass相当脆弱(例如,在简单地添加您添加的基本代码时,它就会中断,并且似乎依赖于您悄悄删除的 termios hack)。通常,尽量不要从网站上的文章中学习C ++。而是从a good book了解它!

您可以通过adding cin.ignore(256, '\n') after cin >> name来解决此问题,尽管坦率地说这有点麻烦,而使用std::getline提取用户名可能更好。