我正在学习c ++并且我一直在尝试创建一个“生成器密码”,我几乎没有问题: 这是源(int main):
//Declaring Variables
int PasswordNumbers, PasswordChar;
char alphabet[26] = { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' };
string * passwords;
string password;
//Message and Input
cout << "How Many Passwords Should Generate ?" << endl;
cin >> PasswordNumbers;
cout << "How Many Letters/Numbers Should be in each Passowrd ?" << endl;
cin >> PasswordChar;
passwords = new string[PasswordNumbers];
for (int j = 0; j < PasswordNumbers; j++) { //How Many Passwords?
for (int i = 0; i < PasswordChar; i++) { //How Many Letters/Numbers?
int randomBool = rand() % 2;
if (randomBool == 1) {
int random = rand() % 10;
password.append(to_string(random));
}
else {
int random = rand() % 26;
string randomLetter = to_string(alphabet[random]);
password.append(randomLetter);
}
}
passwords[j] = password;
}
for (int i = 0; i < passwords->length(); i++) {
printf("Random Number: %s \n", passwords[i].c_str());
}
delete[] passwords;
问题:
代码看起来很好,我看不出有什么问题......
答案 0 :(得分:1)
您只获得了数字,因为std::to_string()
没有char
的专业化。因此,当您执行to_string(alphabet[random]))
时,它会将char
转换为int
(返回字母的字符代码),然后将其转换为字符串。因此to_string('a')
为"97"
,而不是"a"
。
您可以使用包含字母表的字符串代替数组。 std::string::append()
允许您指定要从中复制的子字符串。所以你可以这样做:
string alphabet = "abcdefghijklmnopqrstuvwxyz";
int random = rand() % alphabet.size();
password.append(alphabet, random, 1);
这也解释了为什么您的密码不是所需的长度。当它打算附加一个字符时,它会附加2或3位数字。
最后,每次要生成新密码时都不会清除password
,因此您要附加旧密码。对此的简单解决方案是将string password;
声明移到第一个for
循环中。
您还应该在程序开头调用srand(time())
,这样每次运行时都会获得不同的密码。否则,程序始终以相同的随机种子开始。