Получение случайных символов из функции - PullRequest
0 голосов
/ 06 декабря 2018

Я изучаю C с книгой rn и пытаюсь создать генератор паролей j4f, но я не знаю, как получить случайные символы.Я также хочу иметь возможность сказать, сколько символов я хочу, и он должен быть в состоянии вернуться из функции.

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Что вы хотите сделать, это определить строку, содержащую все возможные символы, которые вы хотите внутри случайного пароля.

const char password_chars[] = "abcdefghijklmnopqwxyzABCDEFGHIJKLMNOPQWXYZ1234567890";

Теперь вы хотите взять случайное число для использования в качестве индекса для этой строки.Вы используете простой трюк, общий для генератора случайных чисел, чтобы сгенерировать случайное число между «a» и «b», используя модуль:

rand() % (b-a+1) + a

В вашем случае «b» - это длина строки, содержащейвсе возможные символы и 'a' равно 0.
Соберите все вместе в функцию, и вот как это реализовать:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

const char password_chars[] = "abcdefghijklmnopqwxyzABCDEFGHIJKLMNOPQWXYZ1234567890";

char * password_generator( int pwd_length)
{
    char * pwd = malloc( pwd_length + 1);
    for( int i=0; i<pwd_length; i++)
        pwd[i] = password_chars[rand() % strlen(password_chars)];
    pwd[pwd_length] = '\0';

    return pwd;
}

int main()
{
    srand( time( NULL));

    char * password = password_generator( 10);

    printf( "%s\n", password);

    free( password);

    return 0;
}
0 голосов
/ 06 декабря 2018

Чтобы получить «случайные» целые числа из диапазона от 0 до RAND_MAX (что является довольно большим верхним пределом, характерным для реализации), вы можете использовать функцию rand из stdlib.h.

Попробуйте это:

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    printf("%i\n", rand());
    return 0;
}

( рабочий пример )

( документация по rand )

ЕстьТем не менее, проблема остается: этот код будет выдавать один и тот же вывод при каждом запуске программы.Чтобы предотвратить это, нам нужно запустить генератор случайных чисел - и , хотя это, строго говоря, не гарантирует работу , на практике почти каждая реализация поддерживает заполнение генератора с текущим временем.Это сводится к вызову srand(time(0)) (или эквивалентно srand(time(NULL))) перед первым (и только первым) вызовом rand():

    #include <stdlib.h>
    #include <stdio.h>

    int main(void)
    {
        srand(time(NULL));
        printf("%i\n", rand());
        printf("%i\n", rand());
        return 0;
    }

( рабочий пример )

( srand документация )

Попробуйте выполнить оба приведенных выше примера несколько раз и посмотрите разницу.

Теперь, как перевести числа в символы?Почти все реализации кодируют символы в кодировке ASCII ( ссылка на Википедию ).Вы можете легко преобразовать числа в символы, используя таблицу преобразования из Википедии:

    #include <stdio.h>

    int main(void)
    {
        int i = 68;
        char ch = i;
        printf("%c\n", ch);
        return 0;
    }

Согласно таблице 68 переводится в D, и это действительно то, что напечатано: ( рабочий пример )

Теперь я собирался сказать "ваша очередь сейчас", но, очевидно, ответ выше меня касается и остальных, поэтому я не буду это говорить.

0 голосов
/ 06 декабря 2018

Если предположить ASCII, что-то вроде этого должно работать:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

char *randpw(int len) {
    char *tmp = malloc(len + 1); // +1 so there's room for null terminator
    for (int i = 0; i < len; i++) {
         /*
             choose a character between 32 and 126, inclusive,
             and put the character into the string.
         */
         tmp[i] = (rand() % (126 - 32)) + 32; 
    }
    tmp[len] = '\0'; // include null termination on string.
    return tmp;
}

int main(void) {
    srand( time( NULL));
    char *pwd = randpw(15);
    printf("%s\n", pwd);
    free(pwd);
    return 0;
}

Каждый символ будет иметь значение от 32 до 126. Если вы посмотрите на таблицу ASCII, вы увидите, что это разумные символы на выбор.

Эта функция будет выделять память и возвращать строку случайных символов любой длины, которую вы ей дадите.

...