0

ユーザーがパスワードを入力してシス​​テムにログインできるようにするプログラムをCで作成しました。メソッド fgets を使用しています。正しいパスワードは「letmein」です。これはコードです:

ここで、stdin を介してユーザーが入力したパスワードが 8 文字を超えていないことを確認したいと思います。プログラムが (空の if ステートメントなしで) であるため、fgets によって最初の 7 文字のみがフェッチされるため、ユーザーは「letmein0000000」と入力してもアクセスが許可されます。ユーザーが「letmein」と入力した場合にのみ、ユーザーにアクセスを許可したいと考えています。どうすればこれを行うことができますか?

PS fgets は私のプロジェクトの要件であるため、使用する必要があります。

4

1 に答える 1

6

のドキュメントからfgets():

指定されたファイル ストリームから最大で count - 1 文字を読み取り、それらを str に格納します。生成される文字列は常に NULL で終了します。ファイルの終わりが発生した場合、または改行文字が見つかった場合、解析は停止します。この場合、str にはその改行文字が含まれます。

最大文字数の読み取りを要求します(これは、2 番目の引数として8渡すことを意味します)。9ユーザーが複数の7文字を入力すると、キャッチされる可能性があります。ユーザーに失敗を通知し、 に残っているものはすべてスキップしstdinます。ユーザーが正しく入力7してリターンをヒットfgets()すると、改行文字で停止します。

の戻り値をチェックfgets()して、コードが初期化されたバッファを処理しようとしていないことを確認してください。

例えば:

char password[9];

if (fgets(password, 9, stdin))
{
    /* Strip new-line if present. */
    char* nl = strchr(password, '\n');
    if (nl) *nl = 0;

    if (strlen(password) > 7)
    {
        /* Password too long. 
           Skip remaining input if necessary. */
        int c;
        while ((c = fgetc(stdin)) != EOF && c != '\n');
    }
    else if (0 == strcmp("letmein", password))
    {
        /* Good password. */
    }
    else
    {
        /* Incorrect password. */
    }
}
于 2012-10-04T15:03:07.437 に答える