如何在C中显示密码的每个输入字符* - 使字符不可见

时间:2012-10-17 08:02:23

标签: c

  

可能重复:
  Hide password input on terminal

我想实现这个目标:

$Insert Pass:
User types: a (a immediately disappears & '*' takes its position on the shell)
On the Shell    : a
Intermediate O/P: * 

User types: b (b immediately disappears & '*' takes its position on the shell)
On the Shell    : *b
Intermediate O/P: **

User types: c (c immediately disappears & '*' takes its position on the shell)
On the Shell    : **c
Final O/P       : *** 

我尝试了以下方法:

#include <stdio.h>
#include <string.h>

#define SIZE 20

int main()
{

    char array[SIZE];
    int counter = 0;

    memset(array,'0',SIZE);

    while ((array[counter]!='\n')&&(counter<=SIZE-2))
    {
        array[counter++] = getchar();
        printf("\b\b");
        printf ("*");
    }

    printf("\nPassword: %s\n", array);

    return 0;
}

但我无法达到预期的输出。此代码无法使用户输入的字符不可见&amp;立即显示'*'。

有人可以指导我。

感谢。

最诚挚的问候, Sandeep Singh

2 个答案:

答案 0 :(得分:1)

你的方法不起作用;即使你可以覆盖这个角色,我也可以在像script(1)这样的工具中运行你的命令并查看输出。

正确的解决方案是将终端从熟化模式切换到原始模式并关闭回声。

第一个更改将使您的程序在键入时查看每个字符(否则,shell将收集一行输入并在用户按下enter后将其发送到您的进程)。 / p>

第二次更改会阻止shell /终端打印用户键入的内容。

See this article如何做到这一点。

答案 1 :(得分:0)

问题是getchar()等待用户按下回车键然后立即返回整个字符串。你想要的是一个在键入字符后立即返回的方法。虽然没有便携式方法可以执行此操作,但对于Windows,您可以在应用程序中#include <conio.h>并将array[counter++] = getchar()替换为array[counter++] = _getch(),它应该可以正常工作。