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

是否有一个库函数创建一个随机字符串,就像mkstemp()创建一个唯一的文件名一样? 它是什么?

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

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

  “:; @ [\] ^ _`{|}” 

我认为许多这些角色在各种操作系统的文件名中可能无效。

API中没有构建,您可以使用(在* x系统上) /dev/urandom

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

请注意,这将创建二进制数据,而不是字符串数据,因此您可能必须在之后对其进行过滤。

您也可以使用标准伪随机生成器rand()

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