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
-循环条件下,如果更改密码中的元素数,则循环会中断。这不是一个好习惯。如果需要更多帮助,请发布准确的代码。