我知道在键入标准ANSI C时不可能回显*但是有人在控制台中键入密码时没有显示任何内容。我的意思是像Unix / Linux终端中的sudo提示。就像输入命令一样:sudo cp /etc/somefile ~/somedir
。通常会提示您输入root密码。当您输入时,终端不显示任何内容。这种效果在C中是否可行?如果是,怎么样?
答案 0 :(得分:9)
您正在寻找的功能是:getpass()。但是,您会注意到它被标记为“LEGACY”。虽然它不会去任何地方,但该函数不允许指定输入缓冲区的大小,这使得它不是一个非常好的接口。正如Jefromi所指出的那样,glibc手册以允许任意输入大小(并且不是LEGACY)的方式提供portable example code for implementing getpass from scratch。
答案 1 :(得分:2)
sudo是用C编写的,所以是的:)。 getpass()
函数Safyan mentioned可能就是你想要的,但是如果你感兴趣的话,这里是真正的sudo工具的地方:
http://sudo.ws/repos/sudo/file/dc3bf870f91b/src/tgetpass.c#l70
答案 2 :(得分:1)
穷人这样做的方法是逐个字符地读取用户输入,并在收到每个字符后打印退格字符,后跟*
。输出在技术上被发送到控制台,但它会立即被星号擦除并覆盖(通常在该帧甚至被绘制到屏幕之前)。请注意,这不是一个真正安全的方法,并且有几个安全漏洞,但对于低技术低安全性应用程序,它可以工作。
答案 3 :(得分:0)
*这不是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;
}
答案 4 :(得分:0)
#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]);
}
}