如何循环访问 cpp 中的函数返回的字符指针数组

How to iterate over a char pointer array returned by a function in cpp

本文关键字:函数 返回 字符 数组 指针 cpp 何循环 循环 访问      更新时间:2023-10-16

我创建了一个函数,该函数从 a-z 的随机字符创建一个 28 数组。 当我尝试从main迭代指针数组时,我得到了错误的值。

我错过了什么?

我知道数组是通过引用函数传递的,是否也通过引用返回?

#include <iostream>
#include <ctime>
#define MAX 28
// Generate random char array with a-z values
char* generateRandomString(int length) {
char random[length];
for (int i = 0; i < length; i++) {
// Minimun a ascii = 97
// Maximun z ascii = 122
srand(int(time(NULL))); // Timestamp seed generator
int randomInt = 97 + (rand() % 25);
char randomChar = randomInt;
random[i] = randomChar;
}
return random;
}
int main() {
char* random = generateRandomString(MAX);
for (int i = 0; i < MAX; i++) {
std::cout << random[i] << std::endl; // (*random)[i] Does not work neither
}
return 0;
}

您返回的指针指向一个局部变量,该指针在调用方可以使用它之前超出了范围。 只需改用std::string即可。

而且不要多次打电话srand(),只叫一次。1

1:更好的是,根本不使用srand(),而是使用<random>库中的C++随机数生成器。

#include <iostream>
#include <string>
#include <ctime>
#define MAX 28
// Generate random char array with a-z values
std::string generateRandomString(int length) {
std::string random;
random.resize(length);
for (int i = 0; i < length; i++) {
// Minimun a ascii = 97
// Maximun z ascii = 122
int randomInt = 97 + (rand() % 25);
char randomChar = randomInt;
random[i] = randomChar;
}
return random;
}
int main() {
srand(int(time(NULL))); // Timestamp seed generator
std::string random = generateRandomString(MAX);
for (int i = 0; i < MAX; i++) {
std::cout << random[i] << std::endl; // (*random)[i] Does not work neither
}
return 0;
}
char random[length];

^^This^^ 数组存在于堆栈上。当generateRandomString()返回时,它返回即将死亡的变量的地址。要使该内存保持活动状态,您需要动态分配它:

char* generateRandomString(int length) {
char* random = new char[length + 1];
for (int i = 0; i < length; i++) {
// Minimun a ascii = 97
// Maximun z ascii = 122
srand(int(time(NULL))); // Timestamp seed generator
int randomInt = 97 + (rand() % 25);
char randomChar = randomInt;
random[i] = randomChar;
}
random[length] = 0; //< null terminate string
return random;
}

请记住,使用完内存后,您需要删除内存!

char* random = generateRandomString(MAX);
...
delete[] random;

或者,使用std::string

std::string generateRandomString(int length) {
std::string random(length);
for (int i = 0; i < length; i++) {
// Minimun a ascii = 97
// Maximun z ascii = 122
srand(int(time(NULL))); // Timestamp seed generator
int randomInt = 97 + (rand() % 25);
char randomChar = randomInt;
random[i] = randomChar;
}
return random;
}
std::string random = generateRandomString(MAX);
...

函数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] = '';
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;
}

请注意,使用像 97 这样的幻数不是一个好主意。它们使代码不清楚。而且通常不需要使用 #define 指令在C++中定义常量。请改用常量C++声明。