C言語関係掲示板

過去ログ

No.124.パスワードを入力する際の処理


No.720

パスワードを入力する際の処理
投稿者---A2C(2001/12/23 11:36:43)


現在、Microsoft C/C++ を使用してDOS上で動作する簡単なプログラムを作っています。
パスワードを入力する際に、入力しても画面に現れないか、もしくは「*」を画面に出力して、パスワードを見られないようにしたいのですが、どのような処理をすればよいのでしょうか。初心者なので詳しく教えていただけるとありがたいです。


No.721

Re:パスワードを入力する際の処理
投稿者---B.Smith(2001/12/23 17:25:17)


こんにちは。
自分でパスワード入力処理を作成する方法の一例をご紹介します。参考にしてみてください。

最も簡単な方法は、表示も何もせずにコンソールから直接入力文字を読み取ることですが、あまり実用的ではありません。

このサンプルでは入力位置をユーザに知らせるため、おなじみのアスタリスク'*'を表示します。特殊な入力としてはBSキー(後退)、ENTERキー(入力終了)のみ対応しました。その他のキーの追加も容易だと思います。

入力処理を自作する際のポイントは、1文字入力後の処理の速度効率を侮らないことです。極端に遅い処理では入力レスポンスが悪くなり、ユーザを苛立てることになります。特に、作成したアプリケーションを種類の違うマシンで使用する場合は要注意です(C言語アプリケーションの実行速度とマシンの処理速度を過信しないように…)。

・DOSということなので、処理を簡単にするためエスケープシーケンスを使用してprintfにより表示位置を設定します。"\033[y;xH"を表示することでカーソル位置を設定できます(y、xは表示位置)。

・BSキーと、その他のキー(デフォルト)の表示のタイミングに注意してください。入力を表す'*'の表示、消去、に使用されるPositionは、次の入力時に'*'が表示される位置を表しています。
サンプル.
#include <stdio.h>
#include <conio.h>
#include <string.h>

#define     KEY_BACKSPACE   0x08    /* BSキー */
#define     KEY_ENTER       0x0d    /* ENTERキー */

int     Password(
            char    *pCaption,  /* キャプション */
            int     x,          /* キャプションx座標 */
            int     y,          /* キャプションy座標 */
            char    *pString,   /* 入力パスワードを格納するバッファ */
            int     MaxLength)  /* 入力制限文字数 */
{
    int     Key;
    int     Cnt;
    int     Position;

    /* キャプションを表示 */
    printf("\033[%d;%dH%s",y,x,pCaption);

    /* 入力文字'*'を表示する位置はキャプションの後ろ */
    Position = x + strlen(pCaption);

    Cnt = 0;    /* 入力文字数 */

    /* ENTERキーが押されるまで繰り返す */
    while((Key = getch()) != KEY_ENTER){
        switch(Key){
            case    KEY_BACKSPACE:  /** BSキー **/

                    /* 入力文字数がゼロの場合処理しない */
                    if (!Cnt) break;

                    Cnt--;     /* 入力文字数を一文字分引く */
                    pString--; /* ポインタを一つ減じる */

                    Position--;/* 表示位置を一文字分引く */
                    printf("\033[%d;%dH ",y,Position);/* '*'を消去 */
                    break;
            default:    /** その他のキー(入力対象)**/

                    /* 入力文字数が制限文字数に達していた場合処理しない */
                    if (Cnt >= MaxLength) break;

                    Cnt++;      /* 入力文字数を一文字分加算 */
                    *(pString++) = (char )Key;/* 文字をセット後一つ進める */

                    printf("\033[%d;%dH*",y,Position);/* '*'を表示 */
                    Position++;/* 表示位置を一文字分進める */
        }
    }

    *pString = 0;/* 末尾ヌル */

    return Cnt; /* 入力されたパスワード長を返す */
}

No.722

Re:パスワードを入力する際の処理
投稿者---a2c(2001/12/24 19:44:01)


ありがとうございます! さっそくやってみます。

No.736

Re:パスワードを入力する際の処理
投稿者---A2C(2001/12/26 18:53:40)


すいません。教えていただいた方法を参考にしてなんとかできたのですが、将来的にUNIXで動かしたいのでgetch()はまずいような気がします。他に方法はありませんか?

No.737

Re:パスワードを入力する際の処理
投稿者---B.Smith(2001/12/27 00:30:16)


申し訳ありません。UNIXには詳しくないので、正確な回答をすることができません。
ANSI Cでは非ブロッキング入力をサポートしていませんので、キーボード入力処理は処理系に依存することになります。そのため、今回ご紹介したプログラムに移植性を保たせることはできません。

UNIXの入力に関して、参考になるかもしれないHPを発見したので紹介します。

http://www.ncad.co.jp/~komata/c-kouza24.htm

UNIXで入力待ちをせず、かつエコーバックしない入力を行うことができれば、No.721でご紹介したようなプログラムを実現できるかもしれません。


No.738

Re:パスワードを入力する際の処理
投稿者---kikk(2001/12/27 03:58:34)


ども。


ちょっとだけ、参考程度に。

おそらくもっとも一般的な方法はcursesライブラリを利用する方法だとおもい
ます。getch()もできるし、DOS系のエスケープシーケンスでできることはできる
はずです。UNIXの範囲なら移植性も高いですし。詳細はオンラインマニュアルか、
適当なWebサイトを検索してみてください(「cursesライブラリ」でヒットします)。
# コンパイル時にオプション-lcursesが必要かもしれないので注意


では。

No.739

Re:パスワードを入力する際の処理
投稿者---A2C(2001/12/27 10:26:11)


B.Smith、kikkさん、どうもありがとうございます。お二人の意見を参考にして作ってみます!


戻る


「初心者のためのポイント学習C言語」 Last modified:2002.02.03
Copyright(c) 2000-2002 TOMOJI All Rights Reserved