是否有一个库函数可以像mkstemp()
函数一样创建一个随机字符串?它是什么?
是否有一个库函数可以像mkstemp()
函数一样创建一个随机字符串?它是什么?
没有标准的函数,但您的操作系统可能会实现某些功能。您是否考虑过查找手册?另外,这个任务很简单。我会倾向于使用类似以下代码:
#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系统上可以正常工作,并且能够适应几乎任何字符集。我没有将以下字符添加到字符集中,因为很明显您希望的是可以用作文件名的字符串:
":;?@[\]^_`{|}"
我认为这些字符中的许多字符可能在各种操作系统上都无效。
#include <time.h>
..
在 main
中的所有其他内容之前:
srand((unsigned int)(time(NULL)));
(用时间种子随机数) - Alex Hallindex = rand() % ( sizeof charset - 1 );
? - pmorrand
并确定你建议的模式存在微妙的错误。 - autistic没有内置的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 '}'
}
如果您需要真正的随机字符串,您需要搜索生成随机序列密码学
,这是密码学中仍未完美解决的难题之一 :)