【问题标题】:Enter Password in C在 C 中输入密码
【发布时间】:2026-02-21 03:40:01
【问题描述】:

我知道在您输入标准 ANSI C 时无法回显 *。但是当有人在控制台中输入密码时,有没有办法不显示任何内容。我的意思就像 Unix/Linux 终端中的 sudo 提示。就像您输入命令一样:sudo cp /etc/somefile ~/somedir。通常会提示您输入 root 密码。当你输入它时,终端什么也不显示。这种效果在 C 中可能吗?如果是,如何?

【问题讨论】:

  • 显示“”有什么不可以的? printf("");会做的。
  • @Peter K.:我相信他指的是所有标准输入函数都回显到控制台的事实。当然,您可以打印 *,但用户键入的字符已经存在。
  • @Billy:有道理,谢谢!
  • tinyfiledialogs 是单个 C 文件(跨平台),提供图形和控制台基本对话框(包括输入框和密码框)sf.net/p/tinyfiledialogs

标签: c unix passwords


【解决方案1】:
#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环境中不存在,见*.com/questions/8792317/…。您能否进一步解释一下您的解决方案?
  • 欢迎来到 *。请解释您的答案,以便其他人更容易理解。
  • 对于那些在windows TurboC/C++ 中编写代码的人,Visual Studio 编辑器------------> 是的,如果有人想开始一个小项目或任何初学者想要在 C/C++ 编程语言中的字符或字符串数​​组的位置获得星号。 .以及电气工程专业的学生也可以在显示屏上的输入位置使用此代码作为星号并继续进行。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您要查找的函数是:getpass()。但是,您会注意到它被标记为“LEGACY”。虽然它不会去任何地方,但该函数不允许指定输入缓冲区的大小,这使得它不是一个很好的接口。正如 Jefromi 所指出的,glibc 手册以允许任意输入大小的方式提供 portable example code for implementing getpass from scratch(并且不是 LEGACY)。

    【讨论】:

    • 他们应该提供getnpass(),所以不是每个程序员都需要重新发明*...
    【解决方案4】:

    *这不是 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;
    }
    

    【讨论】:

    • 请注意,这不是 ANSI C。
    • 如果您在 UNIX 或 Linux 上编译,我认为 conio.h 可能不可用。
    【解决方案5】:

    sudo 是用 C 语言编写的,所以是的 :)。 getpass() 函数 Safyan mentioned 可能是您想要的,但如果您有兴趣,这里是实际 sudo 工具的功能:

    http://sudo.ws/repos/sudo/file/dc3bf870f91b/src/tgetpass.c#l70

    【讨论】: