如果案例中有陈述

时间:2018-12-07 20:47:25

标签: c++ vector switch-statement

以下代码根据用户先前使用bool函数所做的选择生成不同的字符。用户可以选择是否使用某些字符,例如“数字”或“大写字符”。

我遇到的问题是,在我实施了 switch / case 系统以完全随机分配哪个字符排在第一位之后,就不再尊重选择

例如,用户可以选择关闭数字,但有时数字仍会显示在序列中。出于随机目的而关闭开关时,不会发生 情况(将序列保留为 Lowcase + Uppercase + Symbols + 数字)。

我应该在这里使用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 :(得分:3)

  

每个示例,用户可以选择关闭数字,但有时数字仍会显示在序列中。

您的符号随机生成包含数字(48 ... 57),因此即使您关闭数字符号也可能产生数字

答案 1 :(得分:0)

要回答这个问题,我应该在这里使用if / else -好的。在if/else switch语句中使用case语句是完全可以接受的。

答案 2 :(得分:0)

获取数字的原因是因为StrongPassnumbers等于1。由于您尚未提供在何处/如何/为此分配值,因此我们可以为您提供的最佳建议如下:

如果您不希望出现数字,请确保StrongPassnumbers都等于0。

[编辑] 您输入的选择功能已损坏。您有一个递归调用,您不再捕获其值。不过,不知道您如何使用此功能。

如果第一次调用失败(用户未选择有效输入),则不会调用递归调用的返回值。原始函数无论如何都返回0。即使递归调用是“成功”输入。