如何修复密码条目,它一次输入两个字符
How to fix the password entry, it inputs two characters at a time
我正在设置一个注册和登录程序,但它永远不允许登录。 在执行时,它显示输入两个字符,而用户只键入一个字符,并且在登录时密码永远不会匹配。 转到的任何解决方案。
#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答案和论坛帖子中的人们是如何获得输入的。
希望这有帮助。
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 如何确保用户在一行上提示输入一次时输入名字和姓氏?
- 从子菜单返回后,正确的输入至少进入验证循环一次
- 如何通过一次运行将多个输入样本馈送到C++张量流模型
- caffe 可以一次接收一批具有不同分辨率的输入吗?如果是这样,怎么办?
- 当我输入一个字母时,cin 输入(输入是一个 int),而不是打印错误一次,它打印正确一次,然后在循环的其余部分打印 i
- need else 参数只出现一次,无论在循环中输入多少字符串
- 为什么cin.rdbuf()->sbumpc()在循环中只要求我输入一次?
- 如何修复密码条目,它一次输入两个字符
- 实现递归函数,避免由 C++ 中 include 的循环调用(没有 #pragma 一次)引起的无限循环输入
- 输入迭代器可以重复读取,而输出迭代器只能写入一次
- 有没有一种优雅的方法,根据用户输入只决定一次
- 如何强制 getline() 一次输入一行
- 如何从文件中一次读取一个输入,类似于在c++中使用cin/scanf从控制台读取输入
- 要求用户一次输入 1 个 2D 数组的值
- SDL2似乎只每50ms轮询一次输入
- 重复上一次输入两次
- 如何让数组在下一次输入之前显示数组内容的前一个列表?
- 只使用一次输入的单词
- 一次输入十六进制字符串作为char