C ++密码字段

时间:2011-12-30 17:25:34

标签: c++ crash console-application password-protection

我正在尝试阅读密码而在阅读时,显示 * *。

    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 个答案:

答案 0 :(得分:1)

让我们看看我是否理解你要做的事情(伪代码):

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给你带来麻烦,那么弄清楚如何抓住它或处理它(从屏幕上删除一个星号,并从字符串中删除一个字符)。

祝你好运!

答案 1 :(得分:1)

它也在我的Win7 x64 VS2010系统上崩溃了。结果_gech()正在 DEL 键返回224签名字符中的-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! *

答案 2 :(得分:0)

使用是字母数字函数 - isalnum(char c )来检查参数c是否为十进制数字 或者是大写或小写字母。

然后过滤掉小于32或高于122的字符,如下所示:if (c > 32 && c <122) { Get_Password(); }

下面的MS Windows特定代码不可移植。对于Linux / * NIX / BSD,请参阅:Hide password input on terminal

#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;
}