是否有一个库函数以与mkstemp()
创建唯一文件名相同的方式创建随机字符串?它是什么?
问问题
36116 次
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 回答