从函数中获取随机字符

时间:2018-12-06 18:42:11

标签: c random passwords

我正在用本书rn来学习C,我正在尝试制作一个密码生成器j4f,但是我不知道如何获得随机字符。我还希望能够说出我想要多少个字符,并且应该可以从一个函数中返回它。

3 个答案:

答案 0 :(得分:0)

假设使用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表,您会发现这些字符是可供选择的合理字符。

此函数将分配内存,并返回任意长度的随机字符字符串。

答案 1 :(得分:0)

您要做的是定义一个字符串,其中包含您希望在随机密码中包含的所有可能字符。

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

答案 2 :(得分:0)

为了获得0RAND_MAX之间的范围内的“随机”整数(这是特定于实现的相当大的上限),可以使用{ {1}}。

尝试一下:

rand

working example

documentation of rand

尽管如此,仍然存在一个问题:每次运行程序时,此代码都会产生相同的输出。为避免这种情况,我们需要为随机数生成器-和even though this is, strictly speaking, not guaranteed to work注入种子,实际上,几乎每个实现都支持为当前时间的种子生成种子。归结为在第一次(也是第一次)对stdlib.h的调用之前调用#include <stdlib.h> #include <stdio.h> int main(void) { printf("%i\n", rand()); return 0; } (或等效地srand(time(0))):

srand(time(NULL))

working example

srand documentation

尝试多次运行以上两个示例,看看有什么区别。

现在如何将数字转换为字符?几乎所有的实现都以ASCII编码(Wikipedia link)编码字符。您可以根据维基百科的转换表轻松地将数字转换为字符:

rand()

根据该表,68转换为D,而实际上是这样打印的:(working example

现在我要说的是“现在轮到你了”,但显然我上面的答案也涉及到其余的内容,所以我不会说。