Поле пароля C ++ - PullRequest
       39

Поле пароля C ++

1 голос
/ 30 декабря 2011

Я пытаюсь прочитать пароль, и пока я его читаю, выведите на экран **.

    cout << "\n Insert password : ";
loop1:
    string passw1 = "";
    char ch = _getch();
    while (ch != 13) // enter = char 13
    {
        if (!isalnum(ch))
        {
            cout << "\n\n Invalid character! Please insert the password again! ";
            goto loop1;
        }

        passw1.push_back(ch);
        cout << "*";
        ch = _getch();
    }

Если я нажму, например, BACKSPACE или SPACE или что-то, что небуквенно-цифровой, все идет как запланировано.Проблема заключается в том, что когда я нажимаю любую клавишу F или клавишу DELETE, HOME, INSERT, END, PG UP, PG DOWN, когда происходит сбой программы.Не могли бы вы помочь мне избежать крушения?Я хотел бы показать сообщение об ошибке, если нажата недопустимая клавиша, чтобы не происходил сбой моей программы.

Ответы [ 3 ]

1 голос
/ 30 декабря 2011

Сбой на моей системе Win7 x64 VS2010. Оказывается, _gech() возвращает 224 для ключа DEL , который равен -32 для знакового символа . Это вызывает isalnum() для внутреннего утверждения.

Я изменил char на int (это то, что _getch() возвращает, а isalnum() принимает за параметр), и проблема переполнения исчезла. unsigned char тоже работает.

int main( )
{
    cout << "\n Insert password : ";
loop1:
    string passw1 = "";
    int ch = _getch();
    while (ch != 13) // enter = char 13
    {
        if (!isalnum(ch))
        {
            cout << "\n\n Invalid character! Please insert the password again! ";
            goto loop1;
        }

        passw1.push_back(ch);
        cout << "*";
        ch = _getch();
    }
    return 0;
}

Выход (нажатие DEL каждый раз):

Insert password :

Invalid character! Please insert the password again! *

Invalid character! Please insert the password again! *
1 голос
/ 30 декабря 2011

Посмотрим, пойму ли я, что вы пытаетесь сделать (в псевдокоде):

Prompt the user for a password
Wait for the user to press any key

While the key pressed is not the enter key
    If the entered key is an alphanumeric
        Add the character to the password string
        Print an asterisk on the screen
        Accept another character
    Else
        Alert the user that they entered a non-alphanumeric
        Clear out the string and have the user start over again
    End If
End While

Если это не то, что вам нужно, измените по вкусу.

ЧтоЯ думаю, что происходит то, что вы не захватываете все возможные символы, когда проверяете, какая клавиша была нажата.Если DEL доставляет вам неприятности, выясните, как его поймать или справиться с ним (уберите звездочку с экрана и удалите символ из строки).

Удачи!

0 голосов
/ 30 декабря 2011

Используйте буквенно-цифровую функцию - isalnum(char c ), чтобы проверить, является ли параметр c десятичной цифрой или заглавные или строчные буквы.

А затем отфильтровать символы меньше 32 или больше 122, например: if (c > 32 && c <122) { Get_Password(); }

Этот специальный код MS Windows ниже не является переносимым. Для Linux / * NIX / BSD см. Это: Скрыть ввод пароля на терминале

#include <iostream>
#include <string>
#include <conio.h>

int main()
{
    std::string password;
    char ch;
    const char ENTER = 13;

    std::cout << "enter the password:  ";

    while((ch = _getch()) != ENTER)
    {

        if (ch > 32 && ch<122)
        {
            if (isalnum(ch))
            {
                password += ch;
                std::cout << '*';

            }

        }
    }
    std::cout <<"\nYour password is : " << password<<"\n\n";
    return 0;
}
...