Генерация случайного символа / цифры - PullRequest
0 голосов
/ 23 июня 2018

Я пытаюсь найти самый быстрый способ создания массива случайных цифр / символов.

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 *). Помогите мне найти лучшее решение моей проблемы. Ty.

Ответы [ 2 ]

0 голосов
/ 23 июня 2018

strcat() принимает char* в качестве ввода, но вместо этого вы даете ему один char, таким образом, ошибка компилятора.

Кроме того, буфер, в который strcat() пишет, должен быть нулевымзавершен, но ваш буфер targ не имеет нулевого завершения изначально, и вы все равно не выделяете достаточно места для окончательного нулевого терминатора.

Вам вообще не нужно использовать 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;
}
0 голосов
/ 23 июня 2018

Я бы сделал два изменения.Во-первых, сделайте статический внутренний массив статическим:

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

Таким образом, вызывающая сторона решает, как выделить память для строки.

...