Буферизация ввода и маскирование пароля ввода C ++ - PullRequest
0 голосов
/ 30 ноября 2018

Я использую фрагмент кода из 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 голосов
/ 30 ноября 2018

Поскольку, когда ваш пользователь вводил имя пользователя, он также вводил символ Ввод (именно так его терминал знал, что нужно отправить строку).Этот символ не был прочитан cin >> name и все еще находится в буфере.Затем getpass читает его как первый символ и немедленно останавливается.

Обратите внимание, что ваш код не совпадает с кодом статьи, который не запрашивает имя пользователя, и показывает getpass, чтоявляется довольно хрупким (например, он ломается при простом добавлении базового кода, который вы добавили, и, кажется, полагается на хаки termios , которые вы тихо удалили).Вообще старайтесь не учить C ++ из статей на сайтах.Изучите это из хорошей книги вместо этого!

Вы можете исправить это, добавив cin.ignore(256, '\n') после cin >> name, хотя, честно говоря, это немного хак, и этовозможно, было бы лучше извлечь имя пользователя, используя std::getline.

...