Проблема при генерации символов
код ниже генерирует случайное слово длины n. Проблема заключается в том, что он генерирует слово длины n, а затем сразу после него добавляет 'ээээ' и получается "hdkshgksээээ". Есть вариант просто стирать последние четыре символа, но хочется решить проблему более адекватно, из-за чего такое может быть? setlocale(0, "") на это не влияет, насколько мне стало ясно.
char *word = new char[n];
for (int i = 0; i < n; i++)
word[i] = ('a' + rand()%('z' - 'a'));
Ответы (2 шт):
У вас нет завершающего '\0' нуля в конце массива, поэтому, когда вы выводите word на консоль, символы выводятся до того момента, когда встретится этот '\0' - в том числе и за пределами выделенной вами памяти.
У вас нет '\0' в конце строки - и из-за этого может выводиться все что угодно пока он не найдется
Далее - у вас метка C++ по этому я бы устранил следующие проблемы
- для генерации псевдослучайных чисел есть random в std там есть к примеру - std::mt19937_64
- для работы со строками все же есть string и вам не придется управлять руками вставкой терминирующего нуля
- генерация от a до z это конечно хорошо, но не гибко я бы добавил все же какой-то набор символов для генерации
накидал для вас прмиер кода По сути тут есть простой генератор чисел в требуемом диапазоне и набор символов из которого будет производиться выборка для инжекта в Вашу случайную строку
алгоритм прост -
- говорим размер требуемой строки
- создаем псевдо случайный генератор
- начинаем производить выборку по случайному индексу и заполнять строку
код :
#include <algorithm>
#include <iostream>
#include <limits>
#include <random>
static unsigned int GenRandInt(unsigned int low = std::numeric_limits<unsigned int>::min(),
unsigned int high = std::numeric_limits<unsigned int>::max())
{
static std::random_device r_dev{};
static std::mt19937_64 mt_engine(r_dev());
static unsigned int _low{low};
static unsigned int _high{high};
static std::uniform_int_distribution<> u_int_d{static_cast<int32_t>(_low), static_cast<int32_t>(_high)};
if (_low != low && _high != high)
{
_low = low;
_high = high;
u_int_d = std::uniform_int_distribution<>{static_cast<int32_t>(_low), static_cast<int32_t>(_high)};
}
return static_cast<unsigned int>(u_int_d(mt_engine));
}
static decltype(auto) CreateGenCharObj()
{
static const unsigned char charset[] = " "
".,?!-_@#$%&*()[]{}:;"
"0123456789"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";
static unsigned int charset_size{sizeof(charset) - 1};
return [&]() { return charset[GenRandInt(0, charset_size)]; };
}
std::string GenRandString(std::size_t size)
{
if (!size)
{
return {};
}
static auto gen_char_obj{CreateGenCharObj()};
std::string line(size, 0);
std::generate(std::begin(line), std::end(line), gen_char_obj);
return line;
}
int main()
{
for (int i{0}; i < 10; ++i)
{
std::cout << GenRandString(GenRandInt(10, 20)) << "\n" << std::endl;
}
return 0;
}