Resumen: mostrar cómo generar cadena aleatoria en C, de cualquier longitud, usando srand.
Vamos a ver cómo obtener un carácter aleatorio de una muestra y agregarlo a la cadena de destino usando ANSI C.
Generar cadena aleatoria en C
El algoritmo es sencillo. Debemos definir nuestra muestra, es decir, de donde tomaremos los caracteres:
char muestra[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
Ahora debemos hacer un ciclo desde 0 hasta la longitud de la cadena de destino. En cada paso del ciclo:
- Generamos un índice aleatorio que esté en los límites de la muestra
- A la cadena de destino le asignamos el carácter que esté en la muestra, usando el índice aleatorio.
Como sabemos, las cadenas en C son un poco complejas así que lo haremos en forma de función en donde quien invoca a la función indica el destino y la longitud.
Función en C
El código queda así:
void cadena_aleatoria(int longitud, char *destino) {
char muestra[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
for (int x = 0; x < longitud; x++) {
int indiceAleatorio = aleatorio_en_rango(0, (int) strlen(muestra) - 1);
destino[x] = muestra[indiceAleatorio];
}
}
Como ves, recibimos la longitud y la cadena de destino, así evitamos cometer errores de cadenas, pues el que invoca a la función debe definirla.
Por cierto, el índice aleatorio es generado en la línea 4 con rand.
Código completo para generar cadena aleatoria en C
El código queda así:
/**
* Generar cadena aleatoria en C
* @date 2019-12-20
* @author parzibyte
* @see https://parzibyte.me/blog
* */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
// maximo y minimo son inclusivos
int aleatorio_en_rango(int minimo, int maximo) {
return minimo + rand() / (RAND_MAX / (maximo - minimo + 1) + 1);
}
void cadena_aleatoria(int longitud, char *destino) {
char muestra[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
for (int x = 0; x < longitud; x++) {
int indiceAleatorio = aleatorio_en_rango(0, (int) strlen(muestra) - 1);
destino[x] = muestra[indiceAleatorio];
}
}
int main(void) {
#define LONGITUD_DESEADA 50
srand(getpid());
char destino[LONGITUD_DESEADA + 1] = "";// El +1 es por el carácter nulo que marca el fin de la cadena
cadena_aleatoria(LONGITUD_DESEADA, destino);
printf("%s", destino);
}
No olvides que se debe alimentar a srand
, lo que hacemos en la línea 27. Después definimos la cadena de destino cuya longitud debe estar definida en tiempo de ejecución y debe ser constante, para ello usamos #define
.
Finalmente en la línea 29 invocamos a cadena_aleatoria
en donde indicamos la longitud así como el destino, y como no regresa nada (pues modifica internamente a la cadena) no esperamos el resultado, ya que simplemente basta con imprimir destino
.
También puedes explorar más ejercicios sobre C.
Nota importante: este método no sirve para generar contraseñas, no lo uses para cosas de seguridad, ya que no es criptográficamente seguro.
¿Cómo sería el caso cuando la cantidad de cadenas así como la longitud de ellas es especificada por el usuario?
Si tiene dudas específicas puede enviarme un mensaje en https://parzibyte.me/#contacto
Saludos!