如何在字符函数中选择某些字符?

How can i choose certain characters in a char function?

本文关键字:字符 选择 函数      更新时间:2023-10-16

所以我一直在制作一个密码生成器,但我无法拆分我为存储密码字符而制作的字符中的字符:

#include <iostream>
#include <cstdlib>
#include <string>
#include <random>
#include <ctime>
using namespace std;
int main()
{
char letras[] = {"abcdefghijklmnopqrstuvwxyz"};
string senha;
int tamanho;
int num;
cout<<"escreve a quantidade de letrasdsa"<<endl;
cin >> tamanho;
srand(time(0));
for (int i = 0; i < tamanho ; i++){

}
return 0;
}

你能帮我完成最后一部分吗?

如果要生成长度为tamanho这些字符的随机密码,请使用std::sample算法:

const char letras[] = "abcdefghijklmnopqrstuvwxyz";
std::size_t tamanho = 10;
std::string senha;
senha.reserve(tamanho);
std::sample(std::begin(letras), std::end(letras) - 1, std::back_inserter(senha), 
tamanho, std::mt19937{std::random_device{}()});
std::cout << senha; // Sample output: bdefjkmosx

1是从std::end(letras)中减去的,因为字符串文字以零结尾,我们不想在密码中包含''字符。对于const std::string letras = "...";,您不需要该减法。

演示


编辑!

如果您尝试生成 26 个或更多字母的密码,您将看到以前的解决方案不正确。它确实会生成简短的随机密码,但是

如果n大于序列中的元素数,则选择last-first元素。该算法只有在满足LegacyForwardIterator的要求PopulationIterator时才稳定(保留所选元素的相对顺序(。

也就是说,它限制了密码长度并保留了字母的顺序,因此无法获得像"z..."这样的密码。一"。

可能的解决方法是要求std::sample输入 1 个字符tamanho次:

std::string senha;
senha.reserve(tamanho);
std::mt19937 gen{std::random_device{}()};
std::generate_n(std::back_inserter(senha), tamanho, [&]() {
char ch;
std::sample(std::begin(letras), std::end(letras) - 1, &ch, 1, gen);
return ch; 
});

演示

std::string senha(tamanho, ' ');
std::mt19937 gen{std::random_device{}()};
for (auto& ch : senha)
std::sample(std::begin(letras), std::end(letras) - 1, &ch, 1, gen);

演示

编辑 2.

如果您无权访问 C++17 编译器,则可以使用std::uniform_int_distribution获取 C++11 解决方案:

std::string senha;
senha.reserve(tamanho);
std::mt19937 gen{std::random_device{}()};
std::uniform_int_distribution<std::size_t> d(0, std::end(letras) - 
std::begin(letras) - 2);
for (std::size_t i = 0; i < tamanho; ++i)
senha.push_back(letras[d(gen)]);