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

时间:2013-04-02 15:11:18

标签: c

是否有库函数创建随机字符串的方式与mkstemp()创建唯一文件名的方式相同?它是什么?

2 个答案:

答案 0 :(得分:13)

没有标准功能,但您的操作系统可能会实现某些功能。您是否考虑过搜索手册?或者,这项任务很简单。我很想使用像:

这样的东西
#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 :(得分:0)

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

如果你需要真正随机的字符串,你需要谷歌generating random sequence cryptography这是密码学的难题之一,但仍然没有完美的解决方案:)