我正在用本书rn来学习C,我正在尝试制作一个密码生成器j4f,但是我不知道如何获得随机字符。我还希望能够说出我想要多少个字符,并且应该可以从一个函数中返回它。
答案 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)
为了获得0
和RAND_MAX
之间的范围内的“随机”整数(这是特定于实现的相当大的上限),可以使用{ {1}}。
尝试一下:
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))
尝试多次运行以上两个示例,看看有什么区别。
现在如何将数字转换为字符?几乎所有的实现都以ASCII编码(Wikipedia link)编码字符。您可以根据维基百科的转换表轻松地将数字转换为字符:
rand()
根据该表,68转换为D,而实际上是这样打印的:(working example)
现在我要说的是“现在轮到你了”,但显然我上面的答案也涉及到其余的内容,所以我不会说。