我想实现这个目标:
$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
答案 0 :(得分:1)
你的方法不起作用;即使你可以覆盖这个角色,我也可以在像script(1)
这样的工具中运行你的命令并查看输出。
正确的解决方案是将终端从熟化模式切换到原始模式并关闭回声。
第一个更改将使您的程序在键入时查看每个字符(否则,shell将收集一行输入并在用户按下enter后将其发送到您的进程)。 / p>
第二次更改会阻止shell /终端打印用户键入的内容。 See this article如何做到这一点。
答案 1 :(得分:0)
问题是getchar()
等待用户按下回车键然后立即返回整个字符串。你想要的是一个在键入字符后立即返回的方法。虽然没有便携式方法可以执行此操作,但对于Windows,您可以在应用程序中#include <conio.h>
并将array[counter++] = getchar()
替换为array[counter++] = _getch()
,它应该可以正常工作。