0

私が取り組んできたこのC++プログラムは、以下を含むランタイムエラーを生成しています。

1.generatePassメソッドは検証プロセスをスキップします。

2.validatePassメソッドは、ユーザー入力をスキップし、検証もスキップします。

私はc++を初めて使用しますが、Javaのようにユーザー入力に追加するnextLineメソッドや、検証がスキップされる理由に関するアイデアはありますか?これまでに他に何も見つからなかったため、別の視点が役立ちます。

ありがとう、ブライアン。

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>
#include <windows.h>
#include <ctime>
#include <string.h>
#include <time.h>


using namespace std;
#define MAX 80


//declaring functions
int showMenu();     
void generatePass();    
void validatePass();
int countLetters(char *,int *,int *,int *,int *,int *);





int main()
{

    int iChoice;

    // have menu appear, user makes decision, do work, reshow menu
    // do this until user enters 5

    do
    {

        iChoice = showMenu();


    }while(iChoice != 3);

    printf("\n\n\n");
    system("pause");


}//end of main

//Methods placed here:

//showMenu method calls program menu,either 1.generate password,2.enter password and validate. or 3.exit(close program)
int showMenu()
{
    int iChoice;

    system("cls");
    printf("\n\n\t\tWelcome to Password Generator and Validator\n\n");
    printf("\n\t\t1. Generate");
    printf("\n\t\t2. Validate");
    printf("\n\t\t3. Exit");

    printf("\n\n\t\tEnter your menu choice: ");
    fflush(stdin);
    scanf_s("%d", &iChoice);

    // user enters one of 3 values
    // generate,validate or exit program


    switch(iChoice)
    {
        case 1:     // generate
        {
            generatePass();

            break;
        }
        case 2:     // validate
        {
            validatePass();


            break;
        }
        case 3:     // exit
        {
            printf("\n\nProgram exiting!...");

            break;
        }
        default:
        {
            break;
        }
    }//end of switch


    return(iChoice);
} //end of showMenu


//method to generate a random password for user following password guidelines.  
void generatePass()

{

    int iChar,iUpper,iLower,iSymbol,iNumber,iTotal;

    printf("\n\n\t\tGenerate Password selected ");
    printf("\n\n\t\tPassword creation in progress... ");

    int i;
    char password[10 + 1];
    char strLower[59+1] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRTUVWXYZ!£$%^&*";


    srand(time (0));

    for(i = 0; i < 10;i++)
    {
        password[i] = strLower[(rand() % 52)];

    }
    password[i] = '\0';


    iChar = countLetters(password,&iUpper,&iLower,&iSymbol,&iNumber,&iTotal);

    if(iUpper < 2)
    {
        printf("Not enough uppercase letters!!!\n");


    }
    else if(iLower < 2)
    {
        printf("Not enough lowercase letters!!!\n");


    }
    else if(iSymbol < 1)
    {
        printf("Not enough symbols!!!\n");


    }
    else if(iNumber < 2)
    {
        printf("Not enough numbers!!!\n");


    }
    else if(iTotal < 9 && iTotal > 15)
    {
        printf("Not enough characters!!!\n");


    }
    printf("\n\n\n Your new password is verified ");
    printf(password);


    printf("\n\n\n");
    system("pause");



}//end of generatePass method.








//method to validate a user generated password following password guidelines.
void validatePass()
{

    char password[MAX+1];
    int iChar,iUpper,iLower,iSymbol,iNumber,iTotal;

    //shows user password guidelines
    printf("\n\n\t\tPassword rules: ");
    printf("\n\n\t\t 1. Passwords must be at least 9 characters long and less than 15 characters. ");
    printf("\n\n\t\t 2. Passwords must have at least 2 numbers in them.");
    printf("\n\n\t\t 3. Passwords must have at least 2 uppercase letters and 2 lowercase letters in them.");
    printf("\n\n\t\t 4. Passwords must have at least 1 symbol in them (eg ?, $, £, %).");
    printf("\n\n\t\t 5. Passwords may not have small, common words in them eg hat, pow or ate.");

    //gets user password input
    printf("\n\n\t\tEnter your password following password rules: ");
    gets_s(password);


    iChar = countLetters(password,&iUpper,&iLower,&iSymbol,&iNumber,&iTotal);

    if(iUpper < 2)
    {
        printf("Not enough uppercase letters!!!\n");


    }
    else if(iLower < 2)
    {
        printf("Not enough lowercase letters!!!\n");


    }
    else if(iSymbol < 1)
    {
        printf("Not enough symbols!!!\n");


    }
    else if(iNumber < 2)
    {
        printf("Not enough numbers!!!\n");


    }
    else if(iTotal < 9 && iTotal > 15)
    {
        printf("Not enough characters!!!\n");


    }
    printf("\n\n\n Your new password is verified ");
    printf(password);


    printf("\n\n\n");
    system("pause");


}//end validatePass method

int countLetters(char * Password,int * Upper,int * Lower,int * Symbol,int * Number,int * Total)
{
    int iTotal = 0,iC = 0,tU = 0,tL = 0,tS = 0,tN = 0;


    //strlen- function that returns length
    for (int iC = 0;iC < strlen(Password);iC++)
    {

        printf("%d",Password[iC]);
        //uppercase letters are in the range 65 - 90
        //lowercase letters are in the range 97 - 122
        //symbols are in the range 32-48
        //numbers are in the range 47 - 58


        if((Password[iC] < 64) && (Password[iC] < 91))
        {
            tU++;
            iTotal++;

        }
        else if((Password[iC] > 96) && (Password[iC] < 123))
        {
            tL++;
            iTotal++;

        }
        else if((Password[iC] > 32) && (Password[iC] < 48))
        {
            tS++;
            iTotal++;

        }
        else if((Password[iC] > 47) && (Password[iC] < 58))
        {
            tN++;
            iTotal++;

        }

        *Upper = tU;/*set value at memory address = tU,passing by reference saves memory used.*/
        *Lower = tL;
        *Symbol = tS;
        *Number = tN;


    }//end for statement


    return (iTotal);
}//end of countLetters
4

1 に答える 1

1

主な問題は、ビルディングブロックはあるものの、設計の計画に十分に追いついていないことだと思います。心配しないでください、それは修正可能です。

1.generatePassメソッドは検証プロセスをスキップします。

generatePass()はそれ自体の中で検証を実行しますが、これらの行を配置することをお勧めします...

printf("\n\n\n Your new password is verified ");
printf(password);

... elseブロックに入れて、ユーザーがパスワードが正しくないときにパスワードが正常であると思わないようにします。また、現在コードを繰り返しているので、generatePass()でvalidatePass()関数を利用することもできます。

2.validatePassメソッドは、ユーザー入力をスキップし、検証もスキップします。

おそらく、このリンクは、gets_s()で発生している問題に関連しています:StackOverflow.com。いずれにせよ、最初は簡単になるので、当面はscanfを使用できます。また、必要に応じて、後で戻ってプログラムをより堅牢にすることができます。Scanfは、バイパスされている入力を修正します。スキップされる検証は#1と同じパターンであるため、そのために何をしたいのかがわかれば、ここで簡単に実行できます。

Java nextLine()の質問を理解できるかどうかはわかりませんが、%sでscanfを使用して、Java Scanner.nextLine()とほぼ同様の文字列関数を読み取ります。

免責事項:C ++からCに変換するのは簡単だったので、プログラムをCプログラムとして実行しました(Cスタイルのコードで記述する場合は、Cプログラムにすることを検討してください。同様に、プログラムの移植性を高めたい場合は、Windowsのみのもの(たとえば、「_ s」関数)を避けることを選択できますが、完了する前に、これらの「_s」関数からいくつかの優れたユーティリティを取得している可能性があります。だからそれはただのアイデアです。)

于 2012-11-21T22:11:49.483 に答える