生成随机字符串的C库函数是什么?

13

是否有一个库函数可以像mkstemp()函数一样创建一个随机字符串?它是什么?


6
没有标准的函数可以做到这一点,但编写一个非常简单。例如:https://dev59.com/UXRC5IYBdhLWcg3wAcQ3 - Justin Ethier
1
据我所知,标准C库中没有此功能的函数。然而,这个问题已经被问了很多次:http://stackoverflow.com/search?q=%5Bc%5Dcreate+random+string - devrobf
2个回答

21

没有标准的函数,但您的操作系统可能会实现某些功能。您是否考虑过查找手册?另外,这个任务很简单。我会倾向于使用类似以下代码:


没有标准的功能,但你的操作系统可能会实现一些东西。 你有没有考虑过查找手册? 或者,这个任务足够简单。 我会考虑使用类似下面的东西:
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

void rand_str(char *, size_t);

int main(void) {
    char str[] = { [41] = '\1' }; // make the last character non-zero so we can test based on it later
    rand_str(str, sizeof str - 1);
    assert(str[41] == '\0');      // test the correct insertion of string terminator
    puts(str);
}

void rand_str(char *dest, size_t length) {
    char charset[] = "0123456789"
                     "abcdefghijklmnopqrstuvwxyz"
                     "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    while (length-- > 0) {
        size_t index = (double) rand() / RAND_MAX * (sizeof charset - 1);
        *dest++ = charset[index];
    }
    *dest = '\0';
}

这样做的好处是在EBCDIC系统上可以正常工作,并且能够适应几乎任何字符集。我没有将以下字符添加到字符集中,因为很明显您希望的是可以用作文件名的字符串:

":;?@[\]^_`{|}"

我认为这些字符中的许多字符可能在各种操作系统上都无效。


1
除非我进行以下这些调整,否则在我的 Mac 上编译和运行时总是产生相同的输出:在包含部分: #include <time.h>.. 在 main 中的所有其他内容之前: srand((unsigned int)(time(NULL)));(用时间种子随机数) - Alex Hall
为什么不使用 index = rand() % ( sizeof charset - 1 ); - pmor
@pmor 因为我研究了如何正确使用 rand 并确定你建议的模式存在微妙的错误。 - autistic

3

没有内置的API,您可以在*x系统上使用/dev/urandom,例如:

FILE *f = fopen( "/dev/urandom", "r");
if( !f) ...
fread( binary_string, string_length, f);
fclose(f);

请注意,这将创建二进制数据,而不是字符串数据,因此您可能需要在之后进行过滤。
您还可以使用标准的伪随机生成器rand()
#include <time.h>
#include <stdlib.h>

// In main:
srand(time(NULL));
for( int i = 0; i < string_length; ++i){
    string[i] = '0' + rand()%72; // starting on '0', ending on '}'
}

如果您需要真正的随机字符串,您需要搜索生成随机序列密码学,这是密码学中仍未完美解决的难题之一 :)


如果使用EBCDIC字符集,你认为这个随机字符串中可能会有哪些字符? - autistic
@modifiablelvalue 我不知怎么地以为是ASCII码... 而且说实话,我的回答并不是要你完整地“给我代码”,而是作为灵感的启示。 - Vyktor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接