密码程序来掩盖字符 - 怎么了?

password program to mask characters-What's Wrong?

本文关键字:怎么了 字符 掩盖 程序 密码      更新时间:2023-10-16

我已经编写了一个程序,将密码显示为(*),就像我们通常看到的那样,但我不知道它出了什么问题,因为它在输入3个字符后就停止了。。。。请帮忙。。

#include <iostream>
#include<string.h>
#include<conio.h>
using namespace std;
int main(){
char* pass=new char[20];
int i=0;
cout<<"nn Pass : ";
while(pass[i]!='')
{
    pass[i]=getch();
    i++;
    cout<<"*";
}
cout<<"nn";
if(strcmp(pass,"Vivek")==0)
{
    cout<<"Access Granted! "<<endl;
}
else
{
    cout<<"Access Denied!";
}
return 0;
}

所做的更改已在摘要部分中进行了描述。。

//New code based on the discussions below
#include <iostream>
#include<string.h>
#include<conio.h>
using namespace std;
int main()
{
char pass[20];
int i=0;
cout<<"nn Pass : ";
do
{
    pass[i]=getch();
    i++;
    cout<<"*";
}while(pass[i-1]!='');
cout<<"nn";
if(strcmp(pass,"Vivek")==0)
{
    cout<<"Access Granted! "<<endl;
}
else
{
    cout<<"Access Denied!";
}
return 0;
}

在循环中,在将任何值放入插槽之前,您正在检查插槽中的'\0'

while(pass[i]!='')
{
    pass[i]=getch();
    i++;
    cout<<"*";
}

在第一次进入循环之前,i的值为零。翻译过来就是:

while (pass[0] != '')

根据您的初始化,您尚未初始化pass[0]pass阵列中的任何插槽。

可能为零,也可能是2016年。在使用变量(包括数组)之前,您应该始终初始化它们。

您需要重新思考循环将如何终止。例如,当用户按Enter键时,getch()返回的值是多少?是"\0"吗?

此外,为了防止缓冲区溢出(例如,用户输入30个字符),您应该使用C++std::string类型。如果您坚持使用C风格的字符数组,那么您的输入循环应该检查缓冲区溢出。

您还应该处理退格的情况(不要忘记缓冲区下溢检查)。