Функция generateRandomString
возвращает указатель на первый элемент локального массива.
char* generateRandomString(int length) {
char random[length];
//...
return random;
}
После выхода из функции массив не будет живым. Его память может быть перезаписана. Таким образом, указатель будет недействительным. В результате программа имеет неопределенное поведение.
Вместо массива символов вы можете использовать стандартный класс std::string
. Это лучше, чем «вручную» динамически выделять массив символов.
Ниже приведена демонстрационная программа, показывающая, как можно обновить вашу исходную программу.
#include <iostream>
#include <string>
#include <cstdlib>
#include<ctime>
std::string generateRandomString( size_t length )
{
std::string s( length, ' ' );
std::srand( ( unsigned int )std::time( nullptr ) );
for ( auto &c : s )
{
c = 'a' + std::rand() % ( 'z' - 'a' + 1 );
}
return s;
}
int main()
{
const size_t MAX = 28;
std::string s = generateRandomString( MAX );
for ( const auto &c : s ) std::cout << c;
std::cout << '\n';
}
Ее выходные данные могут выглядеть так Например,
xzefeqsnthhgmfunychcklplccjv
Если вы хотите научиться работать с динамически размещаемыми массивами, программа может выглядеть следующим образом
#include <iostream>
#include <cstdlib>
#include<ctime>
char * generateRandomString( size_t length )
{
char *s = new char[length + 1];
s[length] = '\0';
std::srand( ( unsigned int )std::time( nullptr ) );
for ( size_t i = 0; i < length; i++ )
{
s[i] = 'a' + std::rand() % ( 'z' - 'a' + 1 );
}
return s;
}
int main()
{
const size_t MAX = 28;
char *s = generateRandomString( MAX );
std::cout << s << '\n';
delete [] s;
}
Обратите внимание, что это не очень хорошая идея использовать такие магические числа c как 97. Они делают код неясным. И обычно нет необходимости определять константы в C ++ с помощью директивы #define. Вместо этого используйте объявления констант в C ++.