生成随机密码[C ++]

时间:2017-07-12 22:01:36

标签: c++

我正在学习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;

cmd

问题:

  1. 仅生成数字。
  2. 未生成用户选择的字母/数字的数量。
  3. 生成相同的数字。
  4. 代码看起来很好,我看不出有什么问题......

1 个答案:

答案 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()),这样每次运行时都会获得不同的密码。否则,程序始终以相同的随机种子开始。