¿Cuál es la función de biblioteca C para generar una cadena aleatoria?

¿Existe una función de biblioteca que cree una cadena aleatoria de la misma manera que mkstemp() crea un nombre de archivo único? ¿Qué es?

No hay una función estándar, pero su sistema operativo podría implementar algo. ¿Has considerado buscar en los manuales? Alternativamente, esta tarea es bastante simple. Estaría tentado de usar algo como:

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

Esto tiene el beneficio de trabajar correctamente en los sistemas EBCDIC y poder acomodar prácticamente cualquier conjunto de caracteres. No he agregado ninguno de los siguientes caracteres en el conjunto de caracteres, porque parece claro que desea cadenas que podrían ser nombres de archivo:

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

Pensé que muchos de esos caracteres podrían ser inválidos en los nombres de archivo en varios sistemas operativos.

No hay una comstackción en la API, puede usar (en * x system) /dev/urandom como:

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

Tenga en cuenta que esto creará datos binarios, no datos de cadenas, por lo que tendrá que filtrarlos más adelante.

También puede usar el generador estándar pseudoaleatorio 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 '}' } 

Y si necesita una cadena realmente aleatoria, necesita google generating random sequence cryptography que es uno de los problemas difíciles de la criptografía que aún no tiene una solución perfecta 🙂