13

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

4

2 回答 2

19

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

#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 系统上正常工作,并且能够适应几乎任何字符集。我没有将以下任何字符添加到字符集中,因为很明显您想要可能是文件名的字符串:

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

我认为其中许多字符可能在各种操作系统的文件名中无效。

于 2013-04-02T15:39:52.327 回答
2

没有内置 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,这是密码学的难题之一,仍然没有完美的解决方案:)

于 2013-04-02T15:20:28.153 回答