如何修复密码条目,它一次输入两个字符

How to fix the password entry, it inputs two characters at a time

本文关键字:一次 输入 字符 两个 密码 何修复      更新时间:2023-10-16

我正在设置一个注册和登录程序,但它永远不允许登录。 在执行时,它显示输入两个字符,而用户只键入一个字符,并且在登录时密码永远不会匹配。 转到的任何解决方案。

#include<iostream>
#include<conio.h>
#include<string.h>
using namespace std;
int i, t = 3;
struct dateob {
int day;
int month;
int year;
};
struct userdetails {
char name[50];
dateob dob;
char country[100];
char residential_address[100];
char office_address[100];
char citizen_proof[100];
long phoneno;
char gender[10];
long money;
char username[100];
char password[100];
};
userdetails ud[3];
char u[100], u1[100];
void Entering(char a, int n)
{
if (a == 'S')
{
cout << "Username ";
cin.ignore();
cin.getline(ud[n].username, 100);
string user = ud[n].username;
cout << "Password ";
for (i = 0; i < 100; i++)
{
ud[n].password[i] = _getch();
if (ud[n].password[i] == 13)
break;
cout << "*";
}
cout << "n"
<< "User Createdn";
goto login;
}
else if (a == 'L')
{
login:
char username[100], password[100];
cout << "Welcome To Login";
for (int j = 0; j <= 3; j++)
{
cout << "Username ";
cin.ignore();
cin.getline(username, 100);
cout << "Password ";
for (i = 0; i < 100; i++)
{
password[i] = _getch();
if (password[i] == 13)
break;
cout << "*";
}
if (strcmp(username, ud[n].username) == 0 && strcmp(password, ud[n].password) == 0)
{
cout << "You can Enter :)";
break;
}
else
{
cout << "nSomething went wrong! n";
cout << "You Left with" << t-- << "Try n";
}
}
if (t == 0)
cout << "You are Suspicious";
}
}
int main()
{
char a, b, c;
int d;
for (int n = 0; n < 3; n++)
{
cout << "Do you want to enter users :Y/N ";
cin >> b;
if (b == 'Y')
{
cout << "Sign Up : S n"
<< "Login : L n";
cin >> a;
Entering(a, n);
}
else
break;
}
return 0;
}

我只从键盘输入了 2 个字符,但它显示 4 个字符。您可以在此处查看结果的屏幕截图 我希望它获取密码并存储它,然后可以用作登录的参考。

欢迎来到SO,Mrigank。

这段代码有几个问题,如果可以的话,我想帮助你一些指示。很多这些东西已经在评论中了。

首先,不要使用goto,它有很多问题,而是使用循环:

bool loginSuccessful = false;
while (!loginSuccessful) {
// Do the login stuff here
}

其次,电话号码实际上应该是一个字符串(看起来你可能想在顶部的结构中使用char[15]或其他东西)。double类型可能是不稳定和混乱的,实际上应该只用于数学等。

第三,为了回答您的问题,大多数操作系统中的大多数终端都会将字符回显到控制台,因为它们被输入到(cin)中的标准中。不同的操作系统允许您以不同的方式关闭此功能。引用这篇文章:

在 Windows 中,您可以使用 SetConsoleMode() 关闭任何标准输入函数的回显。

#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
int main()
{
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); 
DWORD mode = 0;
GetConsoleMode(hStdin, &mode);
SetConsoleMode(hStdin, mode & (~ENABLE_ECHO_INPUT));
string s;
getline(cin, s);
cout << s << endl;
return 0;
}//main

在 *nix 中,您可以使用"termios"界面禁用回声。

#include <iostream>
#include <string>
#include <termios.h>
#include <unistd.h>
using namespace std;
int main()
{
termios oldt;
tcgetattr(STDIN_FILENO, &oldt);
termios newt = oldt;
newt.c_lflag &= ~ECHO;
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
string s;
getline(cin, s);
cout << s << endl;
return 0;
}//main

如果上述方法不起作用,您可能还可以通过咨询此SO问题获得很多有关如何以不同方式解决此问题的想法。

最后,您的cin调用可能应该完全更改。我以前从未在这种情况下使用过ignore(),这对我来说看起来很奇怪,我认为它不会帮助你。每行最多 100 个字符 (getline(..., 100)),但您应该 只获取 99 个字符,以便为空终止符留下一个字符。(这是一个值为0的字节,表示"字符串已终止或完成"。

与其做getline,不如在cin上使用>>运算符,或者更好的是,看看上面SO答案和论坛帖子中的人们是如何获得输入的。

希望这有帮助。