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

时间:2016-06-12 09:48:13

标签: c++ arrays dev-c++

我在初学者和中级精通c ++之间,我设法使用Dev C ++,Windows 7在c ++中编写基本的登录程序。该程序能够接收用户名和密码的输入并比较它们看他们是否平等。如果是这样,它会欢迎用户并终止程序,如果没有,它将循环回到开头(无限) 然后我查看网上的一些教程,以掩盖 C 中的密码,并尝试用c ++自己这样做。
使用下面包含的代码,我没有任何错误,但我也没有获得所需的输出。最后,即使我输入了正确的密码,我总是说要再试一次。此外,该计划掩盖了一切,包括“输入”和“输入”。和退格'退格'键。这是代码:

#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个字符的密码&#39 ;但是如果用户输入&#34; notapassword&#34;,则必须屏蔽所有字符,而不仅仅是前八个字符。

2 个答案:

答案 0 :(得分:3)

某些操作系统已提供getpass功能或其高级版本。例如,NetBSD implementation is heredocumentation is here。如果您必须自己实现该功能,请阅读该代码。

答案 1 :(得分:3)

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

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

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

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

然后,您将根据从p开始的字符创建一个名为parr[0]的字符串,并一直持续到找到零值字符。由于您从未向数组写过零值字符,这意味着p将包含已键入的字符,后跟未知数量的未知字符,具体取决于计算机中发生的情况&# 39; parr开始后的记忆。这可能是零字节(因此你最终在p中有一个9个字符的字符串)或者它可能是一百万个字节,或者程序可能崩溃,因为它遇到不存在的内存之前如果发现一个字符的值为零。

然后,您将包含至少9个字符的字符串与&#34;密码&#34;进行比较,该字符串长度为8个字符。当然它永远不会匹配。