Если заявление в случае - PullRequest
       16

Если заявление в случае

0 голосов
/ 07 декабря 2018

Следующий код генерирует разные символы на основе выбора, сделанного пользователем, ранее использовавшим функцию bool.Пользователь может выбрать, использовать или нет некоторые символы, такие как «цифры» или «Прописные символы».

Проблема, с которой я столкнулся, заключается в том, что после того, как я реализовал переключатель /case system to полностью рандомизирует, какой символ идет первым, выбор больше не учитывается.

В каждом примере пользователь может отключить цифры, но иногда цифры все равно будут отображатьсяв последовательности.Это не происходит с переключателем, снятым для целей рандомизации (который сохраняет последовательность на строчные буквы + прописные буквы + символы + Numbers ).

Должен ли я использовать if / else здесь или что-то еще не так с остальным кодом?

int randomCharacter_cases;
for(int i=0; i<100; i++)
{
    // If no appropriate option was selected, then the user will go back to selection:
    if(StrongPass==0 && lowercase==0 && Uppercase==0 && numbers==0 && symbols==0)
    {
        // CODE
    }


    // This selects the order of each character:
    randomCharacter_cases=rand()%4+1;

    switch(randomCharacter_cases)
    {
    // Lowercase characters;
    case 1:
    {
        if(StrongPass==1 || lowercase==1)
        {
            keeper.push_back((char)(rand()%(122-97+1)+97));
        }
        break;
    }
    // Uppercase characters;
    case 2:
    {
        if(StrongPass==1 || Uppercase==1)
        {
            keeper.push_back((char)(rand()%(90-65+1)+65));
        }
        break;
    }
    // Symbols;
    case 3:
    {
        if(StrongPass==1 || symbols==1)
        {
            keeper.push_back((char)(rand()%(64-33+1)+33));
        }
        break;
    }
    // Numbers;
    case 4:
    {
        if(StrongPass==1 || numbers==1)
        {
            keeper.push_back((char)(rand()%(57-48+1)+48));
        }
        break;
    }

    }

}

РЕДАКТИРОВАТЬ: StrongPass, вэтот конкретный кусок кода выполняется в случае, когда пользователь не хочет выбирать, какие символы он не генерирует (например, вы можете выбрать любой из четырех типов символов. или вы можете просто сказать, что хотитеавтоматически сгенерированный пароль, который использует все четыре типа символов).

Эта - это функция, используемая для определения каждого отдельного использования:

bool yesno()
{
string inp;
cin>>inp;
if(!(inp=="Y" || inp=="y" || inp=="N" || inp=="n"))
{
    cout<<"Y or N:";
    yesno();
}
if(inp=="Y" || inp=="y")
    return 1;
else
    return 0;
}

РЕДАКТИРОВАТЬ: пример использования:

// Choices we take for each password option:
bool StrongPass,lowercase,Uppercase,symbols,numbers;

// Function for generating random numbers:
srand (time(NULL));

// Default strong options, for easy use:
cout<<"Would you like an automatic S.T.R.O.N.G. password?: ";
StrongPass=yesno();

// If you'd like a more advanced password:
if(StrongPass==0)
{
    cout<<"Length of the password?: ";
    cin>>length;
    cout<<"Length of the password?: "<<length<<"\n";
    cout<<"Include lowercase characters?: ";
    lowercase=yesno();
    cout<<"Include uppercase characters?: ";
    Uppercase=yesno();
    cout<<"Include symbols?: ";
    symbols=yesno();
    cout<<"Include numbers?: ";
    numbers=yesno();
}

// The password itself is generated here:
int randomCharacter_cases;
for(int i=0; i<100; i++)
{
    // This selects the order of each character:
    randomCharacter_cases=rand()%4+1;

    switch(randomCharacter_cases)
    {
    // Lowercase characters;
    case 1:
    {
        if(StrongPass==1 || lowercase==1)
        {
            keeper.push_back((char)(rand()%(122-97+1)+97));
        }
        break;
    }
    // Uppercase characters;
    case 2:
    {
        if(StrongPass==1 || Uppercase==1)
        {
            keeper.push_back((char)(rand()%(90-65+1)+65));
        }
        break;
    }
    // Symbols;
    case 3:
    {
        if(StrongPass==1 || symbols==1)
        {
            keeper.push_back((char)(rand()%(64-33+1)+33));
        }
        break;
    }
    // Numbers;
    case 4:
    {
        if(StrongPass==1 || numbers==1)
        {
            keeper.push_back((char)(rand()%(57-48+1)+48));
        }
        break;
    }

    }

}

Ответы [ 3 ]

0 голосов
/ 08 декабря 2018

Причина, по которой вы получаете числа, в том, что либо StrongPass, либо numbers равно единице.Поскольку вы не указали, где / как / вы назначаете значения для этого, лучший совет, который мы можем вам дать, заключается в следующем:

Если вы не хотите, чтобы числа появлялись, убедитесь, что оба значения StrongPassAND numbers равно 0.

[EDIT] Ваша функция выбора входа не работает.У вас есть рекурсивный вызов, который вы больше не улавливаете.Однако не уверен, как вы ИСПОЛЬЗУЕТЕ эту функцию.

Если первый вызов не удался (пользователь не выбрал допустимый ввод), возвращаемое значение рекурсивного вызова НЕ ПРАВИЛ.Исходная функция возвращает 0, несмотря ни на что.Даже если рекурсивный вызов был «успешным» вводом.

0 голосов
/ 08 декабря 2018

Например, пользователь может отключить номера, но иногда числа все равно будут отображаться в последовательности.

Генерация случайных символов включает числа (48 ... 57),так что даже если вы выключите цифры, символы могут выдавать цифры

0 голосов
/ 07 декабря 2018

Чтобы ответить на вопрос, " Должен ли я использовать if / else here " - Конечно.Вполне допустимо использовать оператор if/else в операторе switch case.

...