我正在尝试找到生成随机数字/字符数组的最快方法。
char *randomGet(int num) {
srand(time(NULL));
const char ab[37] = { "0123456789ABCDEFGHIGKLMNOPQRSTUVWXYZ" };//Alphabet&Digit
char *targ = new char[num];
for (int i = 0; i < num; i++) {
strcat(targ, ab[rand() % 38]);
}
return targ;
}
到目前为止,我已经提出了这个建议,但是它不起作用(char类型的参数与const char *类型的参数不兼容)。 帮助我找到解决问题的最佳方法。是的
答案 0 :(得分:1)
strcat()
将char*
作为输入,但是您却给了它一个char
,因此出现了编译器错误。
此外,strcat()
写入的缓冲区必须为null终止,但是您的targ
缓冲区最初并非为null终止,而且您也不会为最终的null终止符分配足够的空间。
您根本不需要使用strcat()
。由于无论如何都在循环,因此只需将循环计数器用作在缓冲区中写入的索引:
此外,对rand()
的返回值取模时,使用的是错误的整数值。您正在生成一个随机索引,该索引可能会超出ab[]
数组的范围。
尝试以下方法:
char *randomGet(int num)
{
srand(time(NULL));
static const char ab[] = "0123456789ABCDEFGHIGKLMNOPQRSTUVWXYZ"; //Alphabet&Digit
char *targ = new char[num+1];
for (int i = 0; i < num; ++i) {
targ[i] = ab[rand() % 36];
}
targ[num] = '\0';
return targ;
}
答案 1 :(得分:0)
我要进行两项更改。首先,将内部源数组设为静态:
static const char ab[] = "0123456789ABCDEFGHIGKLMNOPQRSTUVWXYZ";
请注意,此版本未指定数组大小;编译器将从初始化程序中弄清楚。
第二,传入一个指向目标数组的指针:
void randomGet(char* targ, int num) {
static const char ab[] = "0123456789ABCDEFGHIGKLMNOPQRSTUVWXYZ";
for (int i = 0; i < num - 1; ++i)
targ[i] = ab[rand() % (sizeof ab - 1)];
targ[num - 1] = '\0';
}
通过这种方式,调用者可以决定如何为字符串分配内存。