我一直在为我的大学课程设计一个密码生成器,其中一个部分涉及创建“复杂”密码,这些密码只不过是随机字符串,用户应该能够指定使用的字符类型。但是,控制是否使用函数的if语句集不会根据uppertrue numbertrue和lowertrue中的值激活,它们都表现为该语句返回true,因此该函数始终运行。 #包括 #包括 #包括 #include
int upper(), lower(), number(), symbol(); //initializing functions to be used to generate the ascii code
int clength = 15;
int pass[30];
int uppertrue = 0, numbertrue = 1, symboltrue = 0;
int main()
{
srand (time(NULL)); //seed random generator
int i = 0; //counter
int which = 0;
do
{
which = rand() % 4 + 1; //randomly decides which type of character will be shown - probablity is unweighted for complex module
if (which == 1)
{
pass[i] = lower(); //inserts the code returned by the function into the array
i++;
}
else if ((uppertrue == 1) && (which == 2))
{
pass[i] = upper();
i++;
}
else if (numbertrue == 1 && which == 3)
{
pass[i] = number();
i++;
}
else if (symboltrue == 1 && which == 4)
{
pass[i] = symbol();
i++;
}
}while (i!=(clength+1)); //terminates loop when the array is complete
std::string strpass;
int x=0;
do
{
char tempchar;
tempchar = pass[x];
std::cout << tempchar;
x++;
}while (x!=15);
return 0;
}
int upper() //creates random number between the range of ascii characters that results in caps
{
return rand() % 65 + 26;
}
int number() //same as upper but for numbers
{
return rand() % 48 + 9;
}
int lower() //same as upper but for lower case
{
return rand() % 122 + 26;
}
int symbol() //same as upper but for symbols (currently only supporting a few characters
{
return rand() % 63 + 6;
}
如果有人能指出我正确的方向,我会非常感激,看起来这是一个逻辑错误,但我看不出任何逻辑错误。它可能与C ++的某种怪癖有关吗? (记住我被教过C,这是我用C ++做的第一件事) 非常感谢 (评论说要删除我通常输入uppertrue等值的部分,所以我已经硬编码了值来代替显示问题)
答案 0 :(得分:2)
你的问题在这里:
int lower() // same as upper but for lower case
{
return rand() % 122 + 26;
}
它将产生26 ... 147范围内的随机数。这与小写字符的范围完全不同。你想要这个:
return rand() % ('z' - 'a' + 1) + 'a';
您应该以类似的方式修复其他功能。
注意那些担心其代码能够运行的人,例如,使用EBCDIC字符编码的大型机:这假设a..z具有连续的字符代码。
答案 1 :(得分:1)
特定的问题是你在随机返回各种字符的函数中有错误。
C ++标准对于与字符关联的数值有意模糊。精确映射到实现,该方案称为编码。
尽管ASCII编码很常见,但它并不是通用的,因此为了实现可移植性,除非你真的需要,否则最好不要对你的平台做出假设。
所以,你真的应该重新排列lower
:
char lower
{
const char* s = "abcdefghijklmnopqrstuvwxyz";
return s[rand() % 26];
}
这是真正的便携式。我也冒昧地改变你的函数返回类型。
你应该为upper
做类似的事情。您的symbols
功能也会同样退出。
我也很想对number
采用相同的方法,但这里的C ++标准会说出有关数字的内容: encoding 必须将字符0
安排到9
按顺序排列在一个连续的块中,所以声明
return rand() % ('9' - '0' + 1) + '0';
是便携式的。作为最后的评论,你可以使用static char[] s = "abc...z";
和(sizeof(s) - 1)
来代替硬编码的26.这是一种非常先进的技术,对于初学者来说并不明显,但是要研究它你的编程技巧得到发展。