1

私はこの問題に数え切れないほど取り組んできましたが、問題が何であるかを見つけることができません。私は問題のすべての部分を変更してテストしましたが、常に奇妙で誤った結果が得られました。コンパイラが誤動作しているのではないかと思い始めています。

これが私がやろうとしていることです。パスワードの入力を求めるプログラムを開発し、プログラムは次の条件が満たされていることを確認します。

6文字以上の長さ。

少なくとも1つの大文字が含まれています。

少なくとも1つの小文字が含まれています。

少なくとも1桁含まれています。

入力したパスワードが基準を満たしていない場合、プログラムは理由を表示し、再入力を求めるプロンプトを表示する必要があります。パスワードが適切な場合は、メッセージが表示され、プログラムが終了します。助けてください!

注:これはコンソール32プログラムです。

#include "stdafx.h"
#include <iostream>
#include <cstring>
#include <cctype>
#include "ctype.h"
using namespace std;

// Function prototype
bool lengthTest(char *);
bool lowCaseTest(char []);
bool upCaseTest(char []);
bool digitTest(char []);
const int SIZE = 20;

int main()
{
    // Buffer to hold the string.
    char password[SIZE];
    int sumofbool;
    // Program Intro Display
    cout << "----PASSWORD VERIFIER PROGRAM----\n\n";
    cout << "Enter a password that meets the following criteria:\n"
    << "-Minimum of 6 characters in length.\n"
    << "-Contains at least one uppercase and one lowercase letter.\n"
    << "-Contains at least one digit.\n\n";
    cout << "->";
    // Get input from user.
    cin.getline(password, SIZE);

    sumofbool = lengthTest(password) + lowCaseTest(password) + upCaseTest(password)
    + digitTest(password);
    // if 1 or more of the 4 functions is not true, display why and prompt for re-entry.
    while (sumofbool < 4)
    {
        if (!lengthTest(password))
        cout << "Error, password must be at least 6 characters long.\n";

        if (!upCaseTest(password))
        cout << "Error, password must contain at least one upper case letter.\n";

        if (!lowCaseTest(password))
        cout << "Error, password must contain at least one lower case letter.\n";

        if (!digitTest(password))
        cout << "Error, password must contain at least one digit.\n";

        cout << "Please re-enter password: ";
        // prompt for re-entry and call functions to test input.
        cin.getline(password, SIZE);
        sumofbool = lengthTest(password) + lowCaseTest(password) + upCaseTest(password);
        + digitTest(password);
    }
    // if conditions for password are met, display message.
    cout << "\nYou entered a valid password.\n\n";

    return 0;
}

//*********LENGTH TEST FUNCTION***********
bool lengthTest(char *str)
{
    int numChar = 0;
    bool validlength = false;
    for (int cnt = 0; cnt < SIZE; cnt++)
    {
        while (*str != 0)
        str++, numChar++;
    }
    if (numChar >= 6)
    validlength = true;

    return validlength;

}
//*********LOWERCASE LETTER TEST FUNCTION*********
bool lowCaseTest(char pass[])
{
    for (int cnt = 0; cnt < SIZE; cnt++)
    {
        if (islower(pass[cnt]))
        return true;
    }
    return false;
}
//********CAPITAL LETTER TEST FUNCTION*********
bool upCaseTest(char pass[])
{
    for (int cnt = 0; cnt < 20; cnt++)
    {
        if (isupper(pass[cnt]))
        return true;
    }
    return false;
}
//**********DIGIT TEST FUNCTION************
bool digitTest(char pass[])
{
    for (int cnt = 0; cnt < 20; cnt++)
    {
        if (isdigit(pass[cnt]))
        return true;
    }
    return false;
}
4

2 に答える 2

1

行に余分なセミコロンがあります

sumofbool = lengthTest(password) + lowCaseTest(password) + upCaseTest(password);
+ digitTest(password);

(うわー、見つけるのに時間がかかりました。)これを修正すると、長さの問題が解決するはずです。

私は次の行も考えています:

for (int cnt = 0; cnt < SIZE; cnt++)
{
    while (*str != 0)
    str++, numChar++;
}

だけに短縮できます

while (*str != 0)
str++, numChar++;

、ただし、これによって機能が変更されることはありません。前者は長さをカウントするだけで、SIZE - 1反復では何もしません。

また、BenTrofatter がコメントで述べたようにSIZE、文字列をテストするたびに文字数をチェックしています。文字列が よりも短い場合、文字SIZE列の長さの後でどのメモリにアクセスしているかわかりません。

これを C++ とタグ付けしたので、MarceloCantos が述べたように C++ 文字列を使用すると思います。パラメーターの受け渡しから部分文字列へのアクセスまで、一般的に操作が簡単です。

于 2012-11-10T03:08:13.747 に答える
0
  1. ブール値を合計しようとしないでください
  2. lengthTest()あなたが持っているものを単純な呼び出しに置き換えますstrlen(str)
  3. ループ内の文字列にアクセスするすべての場所で、strlen()現在そこにあるハードコードされた値ではなく、ループ終了条件として使用します
  4. 使用しないwhile (*str != 0) str++でください。これは、ポインターの暴走とメモリ破損の問題で毎回お尻を噛むことになります
  5. ループ内で変数 i、j、k を使用します。これは C/C++ の標準です。

また、同じ文字列に対する複数の実行を次のような単一の実行に確実に置き換えます。

bool has_uppers = false, has_lowers = false, has_digits = false;

int length = strlen(password);
for( int i=0; i<length; i++) {
    char ch = password[i];
    has_uppers |= isupper(ch);
    has_lowers |= islower(ch);
    has_digits |= isdigit(ch);
}
于 2012-11-10T03:42:24.657 に答える