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

しかし、期待した成果を達成することができません。このコードでは、ユーザー入力文字を非表示にして「*」をすぐに表示することはできません。

誰かがこれについて私を案内してくれませんか。

ありがとう。

よろしく、Sandeep Singh

4

2 に答える 2

1

あなたのアプローチはうまくいきません。文字を上書きできたとしても、次のようなツールでコマンドを実行しscript(1)て出力を確認できます。

正しい解決策は、ターミナルをクック モードからロー モードに切り替え、エコーをオフにすることです。

最初の変更により、プログラムは入力された各文字を認識するようになります (それ以外の場合、シェルは 1 行の入力を収集し、ユーザーが Enter キーを押した後にそれをプロセスに送信します)。

2 番目の変更は、シェル/ターミナルがユーザーの入力内容を出力しないようにします。

これを行う方法は、この記事を参照してください。

于 2012-10-17T08:06:39.337 に答える
0

問題はgetchar()、ユーザーがエンター キーを押すまで待ってから、文字列全体を一度に返すことです。必要なのは、文字が入力された直後に戻るメソッドです。これを行うための移植可能な方法はありませんが、Windows の場合#include <conio.h>、アプリケーション内で置き換えることarray[counter++] = getchar()ができ、動作array[counter++] = _getch()するはずです。

于 2012-10-17T08:07:05.190 に答える