在c++登录程序中屏蔽密码
Masking password in c++ login program
我对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"进行比较。当然,它永远不会匹配。
- 如何取消对nullptr的屏蔽,返回正确的对象
- c++中的oop(密码生成)
- 密码登录程序将永远循环并显示不正确的结果
- OpenSSL没有共享密码
- Cryptopp:获取密码输入的填充字符串
- 密码长度验证 (c++)
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- 仿射密码解密,输出大小写不同
- 替换密码:哪一个?
- 无法使用 openssl 服务器,因为密码已过时...什么的...ERR_SSL_VERSION_OR_CIPHER_MISMATCH
- 如何使用 c++ 在 sqlite3 中打开受密码保护的数据库?
- 根据用户名和密码 Qt C++重新访问数据库值
- C++密码问题
- 无法在 Cocos2dx 中使用受密码保护的 zip 文件
- 在 CPP 中使用正则表达式将密码("ABC")子句屏蔽为密码("****")
- 密码屏蔽(不重复)
- 密码屏蔽(输入显示为********)
- c++密码存储.txt文件+屏蔽输入
- 在c++登录程序中屏蔽密码
- 如何删除密码屏蔽中的字符