在C中输入密码

在C中输入密码,c,unix,passwords,C,Unix,Passwords,我知道在标准ANSI C中键入时不可能回显*。但是有没有办法在控制台中键入密码时不显示任何内容。我的意思就像Unix/Linux终端中的sudo提示。就像您键入命令:sudo cp/etc/somefile~/somedir。通常会提示您输入根密码。输入时,终端将不显示任何内容。这种效应在C语言中可能吗?如果是,如何执行?您要查找的函数是:。不过,您会注意到,它被标记为“遗留”。虽然它不会去任何地方,但函数不允许指定输入缓冲区的大小,这使得它不是一个很好的接口。正如Jefromi所指出的,gli

我知道在标准ANSI C中键入时不可能回显*。但是有没有办法在控制台中键入密码时不显示任何内容。我的意思就像Unix/Linux终端中的sudo提示。就像您键入命令:
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++编程语言中在字符或字符串数组中得到星号。而且,电气工程的学生也可以在显示的输入处使用星号,并继续进行。