在c++登录程序中屏蔽密码

Masking password in c++ login program

本文关键字:屏蔽 密码 程序 c++ 登录      更新时间:2023-10-16

我对c++有点介于初学者和中级精通之间,并且我设法使用Windows 7开发人员c++编写了一个基本的登录程序。这个程序能够接受用户名和密码的输入,并将它们进行比较,看看它们是否相等。如果是,它将欢迎用户并终止程序,如果不是,它将循环回到开始(无限)
然后我在网上看了一些在C中屏蔽密码的教程,并尝试自己在C++中屏蔽密码
使用下面包含的代码,我没有得到任何错误,但也没有得到所需的输出。最后,即使我输入了正确的"密码",也总是有人说我要再试一次。此外,程序会屏蔽所有内容,包括"Enter"answers"Backspace"键。这是代码:

#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
using namespace std;
int main()
{
int i=0;string u;char parr[i],ch;
while (1)
{ 
system("cls");
cout<<"Enter username."<<endl;
cin>>u;
system("cls");
cout<<"Enter password."<<endl;
for (i=0;i<=8;i++)
{   
ch=getch();
parr[i]=ch;
ch='*';
cout<<ch;
}
string p(parr);
if (u=="username" && p=="password")
{
system("cls");
cout<<"Welcome!";
break;
}
else
{
system("cls");
cout<<"Username and password entered does not match! Please try again.";
}
getch();
}    
getch();  
}  

此外,是否有任何方法可以使密码仅针对字符和用户输入的密码长度进行屏蔽,即不只是"密码"一词的8个字符,但如果用户输入"notapassword",则必须屏蔽所有字符,而不仅仅是前8个字符。

一些操作系统已经提供getpass功能或其高级版本。例如,NetBSD实现在这里,文档在这里。如果您必须自己实现该函数,请阅读该代码。

为什么在问这个问题之前没有打印出p的值

您正在创建一个名为parr的数组,其中填充了随机数据。(有些编译器会用已知的非零数据填充数组,但这在编译器之间以及每个编译器的不同模式之间是不同的)。

您的数组长度为0字节。(事实上,标准C++不允许创建大小由变量给定的数组)。

您正在从键盘检索9个字符,并将它们按顺序写入0字节数组parr

然后,根据从parr[0]开始的字符创建一个名为p的字符串,直到找到零值字符为止。由于您从未向数组中写入过零值字符,这意味着p将包含已键入的字符,然后是未知数量的未知字符,具体取决于parr启动后计算机内存中的内容。这可能是零字节(因此您在p中得到一个9个字符的字符串),也可能是一百万字节,或者程序可能会崩溃,因为它在找到值为零的字符之前会碰到不存在的内存。

然后将包含至少9个字符的字符串与8个字符长的"password"进行比较。当然,它永远不会匹配。