以下代码根据用户先前使用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;
}
}
}
答案 0 :(得分:3)
每个示例,用户可以选择关闭数字,但有时数字仍会显示在序列中。
您的符号随机生成包含数字(48 ... 57),因此即使您关闭数字符号也可能产生数字
答案 1 :(得分:0)
要回答这个问题,“ 我应该在这里使用if / else ” -好的。在if/else
switch
语句中使用case
语句是完全可以接受的。
答案 2 :(得分:0)
获取数字的原因是因为StrongPass
或numbers
等于1。由于您尚未提供在何处/如何/为此分配值,因此我们可以为您提供的最佳建议如下:
如果您不希望出现数字,请确保StrongPass
和numbers
都等于0。
[编辑] 您输入的选择功能已损坏。您有一个递归调用,您不再捕获其值。不过,不知道您如何使用此功能。
如果第一次调用失败(用户未选择有效输入),则不会调用递归调用的返回值。原始函数无论如何都返回0。即使递归调用是“成功”输入。