在C中输入密码
我知道在标准ANSI C中键入时不可能回显*。但是有没有办法在控制台中键入密码时不显示任何内容。我的意思就像Unix/Linux终端中的sudo提示。就像您键入命令:在C中输入密码,c,unix,passwords,C,Unix,Passwords,我知道在标准ANSI C中键入时不可能回显*。但是有没有办法在控制台中键入密码时不显示任何内容。我的意思就像Unix/Linux终端中的sudo提示。就像您键入命令:sudo cp/etc/somefile~/somedir。通常会提示您输入根密码。输入时,终端将不显示任何内容。这种效应在C语言中可能吗?如果是,如何执行?您要查找的函数是:。不过,您会注意到,它被标记为“遗留”。虽然它不会去任何地方,但函数不允许指定输入缓冲区的大小,这使得它不是一个很好的接口。正如Jefromi所指出的,gli
sudo cp/etc/somefile~/somedir
。通常会提示您输入根密码。输入时,终端将不显示任何内容。这种效应在C语言中可能吗?如果是,如何执行?您要查找的函数是:。不过,您会注意到,它被标记为“遗留”。虽然它不会去任何地方,但函数不允许指定输入缓冲区的大小,这使得它不是一个很好的接口。正如Jefromi所指出的,glibc手册提供了一种允许任意输入大小的方式(不是传统的)。*这不是ANSI C(感谢Billy)示例
可以使用_kbhit()检测按键,然后使用_getch()获取值。
这两个功能都不会回显屏幕上的内容
#include <conio.h> //For keyboard events
#include <stdio.h> //Include this or iostream
#include <locale>
int main()
{
bool bContinue = true;
char szBuffer[255] = {0};
unsigned int nbufIndex = 0;
while (bContinue)
{
if (_kbhit())
{
szBuffer[nbufIndex] = _getch();
if (szBuffer[nbufIndex] == 0xD)
{
bContinue = false;
}
else
{
++nbufIndex;
printf("*");
}
}
}
printf("\n%s\n", szBuffer);
return 0;
}
#包含//用于键盘事件
#include//include this或iostream
#包括
int main()
{
bool bContinue=true;
char szBuffer[255]={0};
无符号整数nbufIndex=0;
while(b继续)
{
如果(_kbhit())
{
szBuffer[nbufIndex]=_getch();
if(szBuffer[nbufIndex]==0xD)
{
b继续=假;
}
其他的
{
++NBUF指数;
printf(“*”);
}
}
}
printf(“\n%s\n”,szBuffer);
返回0;
}
sudo是用C编写的,所以是:)。getpass()
函数Safyan可能就是您想要的,但是如果您感兴趣,这里是实际的sudo工具实现它的地方:
穷人这样做的方法是一个字符一个字符地读取用户输入的字符,在收到每个字符后,打印出一个退格字符,后跟
*
。从技术上讲,输出被发送到控制台,但它会立即被删除并被星号覆盖(通常在该帧被绘制到屏幕之前)。请注意,这并不是一种真正安全的方法,并且有几个安全漏洞,但对于低技术、低安全性的应用程序,它是有效的。\include
#include <stdio.h>
#include <conio.h>
void main()
{
char pwd[15];
int i;
printf("Enter Password : ");
for(i=0;i<15;i++)
{
pwd[i]=getch();
if(pwd[i]!='\r')
{
printf("*");
}
if(pwd[i]==13)
break;
}
printf("\n \nPassword is : ");
for(i=0;i<15;i++)
{
printf("%d ",pwd[i]);
}
}
#包括
void main()
{
char-pwd[15];
int i;
printf(“输入密码:”);
对于(i=0;i显示“?printf(”)有什么不可能的?@Peter K:我相信他指的是所有标准输入函数都会回显到控制台。当然,您可以打印*,但用户键入的字符已经存在。可能重复@Billy:这很有意义,谢谢!tinyfiledialogs是一个C文件(跨平台)提供图形和控制台基本对话框(包括输入框和密码框)。请注意,这不是ANSI C。如果您在UNIX或Linux上编译,我认为conio.h
可能不可用。他们应该提供getnpass()
因此并非每个程序员都需要重新发明轮子…conio.h
在Linux环境中不存在,请参阅。您可以进一步解释一下您的解决方案吗?欢迎使用Stackoverflow。请解释您的答案,以便其他人更容易理解。对于那些使用windows TurboC/C++编写代码的人,请使用visual Studio editor------------>是的,因为有人想要开始一个小项目或任何初学者想要在C/C++编程语言中在字符或字符串数组中得到星号。而且,电气工程的学生也可以在显示的输入处使用星号,并继续进行。