Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 存储密码,同时保持getch()的完整性_C++_Windows_Console - Fatal编程技术网

C++ 存储密码,同时保持getch()的完整性

C++ 存储密码,同时保持getch()的完整性,c++,windows,console,C++,Windows,Console,有什么简单的方法可以存储用户输入的密码,同时仍然隐藏密码 char password[9]; int i; printf("Enter your password: "); for (i=0;i<9;i++) { password[i] = getch(); printf("*"); } for (i=0;i<9;i++) printf("%c",password[i]); getch(); } char密码[9

有什么简单的方法可以存储用户输入的密码,同时仍然隐藏密码

  char password[9];
   int i;
   printf("Enter your password: ");
   for (i=0;i<9;i++)
   {
   password[i] = getch();
   printf("*");
   }
   for (i=0;i<9;i++)
   printf("%c",password[i]);
   getch();
   }
char密码[9];
int i;
printf(“输入密码:”);

对于(i=0;i您的问题似乎是您没有检查换行符“\n”或文件结尾

printf("Enter your password: ");
char password[9];
int i;
for (i = 0; i < sizeof password - 1; i++)
{
    int c = getch();
    if (c == '\n' || c == EOF)
        break;
    }
    password[i] = c;
    printf("*");
}
password[i] = '\0';

请注意,我们最多在密码中读取8个字符,因为NUL终止符需要一个额外的字符。如果需要,您可以增加该字符。

您的问题似乎是您没有检查换行符“\n”或文件结尾

printf("Enter your password: ");
char password[9];
int i;
for (i = 0; i < sizeof password - 1; i++)
{
    int c = getch();
    if (c == '\n' || c == EOF)
        break;
    }
    password[i] = c;
    printf("*");
}
password[i] = '\0';

请注意,我们最多在密码中读取8个字符,因为NUL终止符需要一个额外字符。如果需要,您可以增加该字符。

您需要在Windows中使用控制台API。下面是一个在控制台窗口中禁用回显的代码段。函数
SetConsoleMode()
用于控制回显(除其他外)。我保存旧模式,以便在检索密码后可以恢复控制台

另外,
*ConsoleMode()
函数需要控制台输入缓冲区的句柄。如何获得这些缓冲区的句柄,请参见
CreateFile()
的MSDN文档


您需要在Windows中使用控制台API。下面是一个在控制台窗口中禁用回显的代码段。函数
SetConsoleMode()
用于控制回显(以及其他内容)。我保存旧模式,以便在检索密码后恢复控制台

另外,
*ConsoleMode()
函数需要控制台输入缓冲区的句柄。如何获得这些缓冲区的句柄,请参见
CreateFile()
的MSDN文档


既然我们在C++中,Windows就这样做:< /P>

#include <iostream>
#include <string>
#include <conio.h> //_getch
#include <Windows.h> //VK_RETURN = 0x0D

using namespace std;

string read_password()
{
    string pass;
    cout << "Enter your password: ";

    int character = 0;
    while(VK_RETURN != (character = _getch()) )
    {
        cout << '*';
        pass += static_cast<char>(character);
    }

    cout << std::endl;
    return pass;
}

int main ()
{
    string root_password = "anypass123";
    string pass = read_password();

    if (pass == root_password)
    {
        cout << "password accepted" << endl;
    }

    return 0;
}
#包括
#包括
#包括//\u getch
#包含//VK_RETURN=0x0D
使用名称空间std;
字符串读取密码()
{
串通;

CUT< P>因为我们在C++和Windows中这样做:

#include <iostream>
#include <string>
#include <conio.h> //_getch
#include <Windows.h> //VK_RETURN = 0x0D

using namespace std;

string read_password()
{
    string pass;
    cout << "Enter your password: ";

    int character = 0;
    while(VK_RETURN != (character = _getch()) )
    {
        cout << '*';
        pass += static_cast<char>(character);
    }

    cout << std::endl;
    return pass;
}

int main ()
{
    string root_password = "anypass123";
    string pass = read_password();

    if (pass == root_password)
    {
        cout << "password accepted" << endl;
    }

    return 0;
}
#包括
#包括
#包括//\u getch
#包含//VK_RETURN=0x0D
使用名称空间std;
字符串读取密码()
{
串通;

在C++中使用<代码> GECH < /C> >而不是<代码> CIN。有什么特殊的原因吗?你在C++中使用<代码> GECH < /C> >的任何特殊原因而不是<代码> CIN。获取< /代码>?没有理由。找不到其他合适的方法。@ CODY: GECHH不回响输入,不像典型的CIN。GET():为什么它说这段的所有变量都是未声明的?JOHH:你是否包含了Prtff()的必要标头?还有getch(),strcmp(),如果您也在使用它的话?否则,我不能说没有看到您的确切代码-为什么不将它粘贴到上面的问题中,并列出确切的编译器错误和行号…?您没有正确使用sizeof。首先,您缺少(),它返回一个以字节为单位的大小。@Josh:sizeof不需要
,除非参数是类型,否则它不需要
)(虽然我曾经告诉过一个老的C++编译器在这方面被打破了),它是一个关键字而不是函数调用,按照<代码>返回<代码>,我不鼓励读者通过不必要地调用一个函数来混淆这两个事物。我可以把<代码>;i<8;< /C> >(不是10)。在
for
-循环条件下,如果更改
password
中的元素数,则循环会中断-这不是一个好习惯。如果需要更多帮助,请发布确切的代码。为什么会说我的此部分的所有变量在未声明时都未声明?Josh:您是否包括printf()的必要标题还有getch(),strcmp(),如果您也在使用它的话?否则,我不能说没有看到您的确切代码-为什么不将它粘贴到上面的问题中,并列出确切的编译器错误和行号…?您没有正确使用sizeof。首先,您缺少(),它返回一个以字节为单位的大小。@Josh:sizeof不需要
,除非参数是类型,否则它不需要
)(虽然我曾经告诉过一个老的C++编译器在这方面被打破了),它是一个关键字而不是函数调用,按照<代码>返回<代码>,我不鼓励读者通过不必要地调用一个函数来混淆这两个事物。我可以把<代码>;i<8;< /C> >(不是10)。在
for
-循环条件下,如果更改
密码中的元素数,则循环会中断。这不是一个好习惯。如果需要更多帮助,请发布准确的代码。