在C语言中输入密码

10

我知道在标准的ANSI C中无法在输入 * 时进行回显。但是是否有一种方法可以在用户在控制台中输入密码时什么都不显示呢?我的意思是像Unix/Linux终端中sudo提示那样。比如,如果你输入命令:sudo cp /etc/somefile ~/somedir,通常会提示你输入root密码。当你输入密码时,终端不会显示任何内容。在C语言中能否实现这种效果?如果可以,怎么做呢?


显示“”有什么不可能的呢?printf(“”);就可以做到。 - Peter K.
@Peter K.:我相信他指的是所有标准输入函数都会回显到控制台。当然,你可以打印*,但用户键入的字符已经存在了。 - Billy ONeal
可能是重复的 https://dev59.com/7HM_5IYBdhLWcg3w2XLw - N 1.1
tinyfiledialogs是一个单一的C文件(跨平台),提供图形和控制台基本对话框(包括输入框和密码框)http://sf.net/p/tinyfiledialogs - tinyfiledialogs
5个回答

9
你需要的函数是:getpass()。但是需要注意的是,它被标记为“LEGACY”,虽然该函数不会消失,但是它不允许指定输入缓冲区的大小,这使其接口不够良好。正如Jefromi所指出的,glibc手册提供了可移植的示例代码,以从头开始实现getpass,并允许任意输入大小(并且不是遗留)。

他们应该提供一个 getnpass(),这样不需要每个程序员都重新发明轮子... - Calmarius

2

1
穷人的做法是逐个字符读取用户输入,每收到一个字符后打印一个退格符后跟随一个*。输出技术上被发送到控制台,但它会立即被一个星号覆盖和擦除(通常在该帧甚至未绘制到屏幕之前)。请注意,这不是真正的安全方法,有几个安全漏洞,但对于低技术低安全性应用程序,它可以工作。

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;
}

1
请注意,这不是 ANSI C。 - Billy ONeal
2
如果你在UNIX或Linux上编译,我认为conio.h很可能不可用。 - Mike Daniels

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]);
    }
}

conio.h在Linux环境中不存在,请参见https://dev59.com/HGoy5IYBdhLWcg3wEKBn。此外,您能否更详细地解释一下您的解决方案? - RobertS supports Monica Cellio
欢迎来到Stackoverflow。请解释您的答案,以便其他人更容易理解。 - octobus
对于那些在Windows TurboC/C++、Visual Studio编辑器中编写代码的人们——是的,如果有人想要开始一个小项目或任何初学者想要在C/C++编程语言中将字符数组或字符串的位置替换为星号,那么可以使用此代码。同时,电气工程学生也可以使用此代码将输入显示为星号并进一步进行处理。 - MaaHii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接