-1

可能重复:
隐藏终端上的密码输入

我想实现这一点:

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

但我无法达到预期的输出。此代码不能使用户键入的字符不可见并立即显示“*”。

有人可以指导我吗?

谢谢。

最好的问候,桑迪普·辛格

4

2 回答 2

1

你的方法行不通;即使您可以覆盖字符,我也可以在类似工具中运行您的命令script(1)并查看输出。

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

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

第二个更改阻止外壳/终端打印用户键入的内容。

请参阅这篇文章如何做到这一点。

于 2012-10-17T08:06:39.337 回答
0

问题是getchar()等到用户按下回车键,然后立即返回整个字符串。您想要的是一种在输入字符后立即返回的方法。虽然没有可移植的方法来做到这一点,但对于 Windows,您可以#include <conio.h>在您的应用程序中替换array[counter++] = getchar()array[counter++] = _getch()它应该可以工作。

于 2012-10-17T08:07:05.190 回答