生成随机字符/数字

时间:2018-06-23 16:59:01

标签: c++ random char digit

我正在尝试找到生成随机数字/字符数组的最快方法。

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 *类型的参数不兼容)。 帮助我找到解决问题的最佳方法。是的

2 个答案:

答案 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';
}

通过这种方式,调用者可以决定如何为字符串分配内存。