【问题标题】:C++ password maskingC++ 密码屏蔽
【发布时间】:2011-02-01 03:20:53
【问题描述】:

我正在编写代码来接收密码输入。下面是我的代码...程序运行良好,但问题是除了数字和字母字符之外的其他键也被读取,例如删除、插入等。我可以知道如何避免它吗?咳咳……

string pw="";
char c=' ';

while(c != 13) //Loop until 'Enter' is pressed
{
    c = _getch();
    if(c==13)
        break;

    if(c==8)
    {
        if(pw.size()!=0)   //delete only if there is input 
        {
            cout<<"\b \b";
            pw.erase(pw.size()-1);
        }
    }

    if((c>47&&c<58)||(c>64&&c<91)||(c>96&&c<123))  //ASCii code for integer and alphabet
    {
        pw += c;
        cout << "*";
    }
}

【问题讨论】:

标签: c++ input passwords masking


【解决方案1】:

使用isalnum() 过滤字母数字或isalpha() 仅用于字母。

另外,您检查c == 13 两次,以下就足够了。

while(1){
  //
  if(c == 13)
    break;
  //
}

if( isalnum(c) ){
  // 'c' is acceptable
}

某些断言在执行过程中失败并引发该错误。

【讨论】:

  • 我已将其更改为: if(isalnum(c)!=0||isalpha(c)!=0) 但是...现在如果我按删除或插入等键,程序会崩溃并弹出一个窗口(Debug Assertion Failed)。我该如何处理断言? tq 你的回复...
  • 没有我断言任何东西...当我按下其他键时程序将崩溃并说断言失败..我现在将我的代码更改为 if(isalnumc(c) || isalpha(c))只有当我输入数字或字母时它才能正常工作......
  • 如果我使用getchar(),用户输入的密码将在显示'*'之前显示..但是那个1可以解决断言问题..
  • 同样重要的是要提到检查字符范围而不是使用 is*() 是未定义的行为。
  • 您真的不想使用 isalnum 检查密码。更好地检查 !isctrl,以便人们可以在密码中使用空格。
【解决方案2】:

如果您可以访问它,最好使用 GNU getpass 函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-17
    • 2013-04-19
    • 2015-09-11
    • 2011-06-04
    • 1970-01-01
    • 2019-04-30
    • 2016-10-12
    • 2016-01-21
    相关资源
    最近更新 更多