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

C++ 如何修复密码输入,它一次输入两个字符,c++,C++,我正在设置一个注册和登录程序,但它从不允许登录。 在执行时,它显示输入两个字符,而用户只输入一个字符,并且在登录时密码从不匹配。 任何关于goto的解决方案 #include<iostream> #include<conio.h> #include<string.h> using namespace std; int i, t = 3; struct dateob { int day; int month; int year; }; struct userde

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

#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 Created\n";
        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;
}
#包括
#包括
#包括
使用名称空间std;
int i,t=3;
结构数据对象{
国际日;
整月;
国际年;
};
结构用户详细信息{
字符名[50];
dateob-dob;
查尔国家[100];
char住宅地址[100];
字符办公室地址[100];
char citizen_证明[100];
长音素;
性别[10];
长钱;
字符用户名[100];
字符密码[100];
};
用户详细信息[3];
字符u[100],u1[100];
无效输入(字符a,整数n)
{
如果(a='S')
{

欢迎来到SO,先生

这段代码有几个地方不对劲,如果可以的话,我想帮你提一些建议。注释中已经有很多这样的东西了

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

bool loginSuccessful = false;
while (!loginSuccessful) {
    // Do the login stuff here
}
第二,电话号码实际上应该是一个字符串(看起来你可能想在顶部的结构中使用
char[15]
或其他什么)。double
类型可能是易变的和混乱的,应该只用于数学之类的

第三,为了回答您的问题,大多数操作系统中的大多数终端在输入标准in(
cin
)时都会向控制台回显字符。不同的操作系统允许您以不同的方式关闭此功能。引用:

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

#包括
#包括
#包括
使用名称空间std;
int main()
{
句柄hStdin=GetStdHandle(标准输入句柄);
DWORD模式=0;
GetConsoleMode(hStdin和模式);
设置控制台模式(hStdin,模式和(~启用回波输入));
字符串s;
getline(cin,s),;
cout>
cin上的操作员,或者更好的是,查看和中的人员是如何获得输入的


希望这有帮助。

粘贴代码后,突出显示所有代码,然后按
{}
按钮,在每行前面加上4个空格(代码块)请发布一个。这意味着代码只足以产生你所得到的错误。
转到登录;
--请不要这样做。
双电话号码;
会很有趣……关于生成一个你需要最小、完整和可验证的密码的一个重要注意事项。以前这个问题缺乏最小值(从技术上讲仍然如此),但现在它也缺少完整的和可验证的。我们无法编译并运行给定的代码(完整的)来查看错误(可验证的)。这意味着我们给出的任何答案都可能不正确,因为我们无法测试它们。也就是说,我们想要MCVE的真正原因是MCVE是一种强大的调试技术。应用它通常会向您揭示错误的原因,并消除问问题的需要。
#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
#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