如何在字符函数中选择某些字符?
How can i choose certain characters in a char function?
所以我一直在制作一个密码生成器,但我无法拆分我为存储密码字符而制作的字符中的字符:
#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)]);
相关文章:
- C++字符*缓冲区的大小
- 如何使用默认参数等选择模板专业化
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何在字符函数中选择某些字符?
- 使用STD :: String和字符数组之间的选择
- 选择字符数组中的单词,然后一一比较它
- 输入验证用于选择用字符的项目,通过CIN.FAIL遇到错误
- 函数从c++中的字符串中选择字符组合
- 在CRichEditCtrl(或RichTextBox)中获取字符的格式,而不选择它
- 如何从字符串中一次选择两个字符?到达字符串的第 i 个位置
- 是否可以使用有条件选择的字符串文本初始化字符数组
- 如何在C++中按索引选择字符串中的特定字符
- C++只选择字符数组的范围
- 找到文本文件中的最后一行,选择前10个字符并打印到一个新文件中
- 只选择字符串C++中的前几个字符
- 使用索引从字符串中选择单个字符
- 为什么选择"universal reference"重载而不是字符数组或字符指针?
- 使用QSocketNotifier对字符设备进行选择