Buenas, he estado esta última semana dándole vueltas a la idea de hacer un bruteforce en C, para que ya estoy aprendiendo, animarme un poco.
El problema es, al ser tu nivel en el lenguaje todavía bajo, no vas a utilizar todas las facilidades que el lenguaje provee y el programa terminara siendo mas largo (y su desarrollo mas difícil) de lo que debería ser.
Tomar un libro y seguir sus ejemplos (mas ejercicios) no te subirá el nivel de adrenalina pero por algo es la mejor forma de aprender.
No tengo mucho tiempo para mejorarlo por eso de estudiar, y cuando tengo, no veo que cambiar (detalles importantes, y lo único que he hecho es conseguir logearme en localhost con esta "aaaad" en la opción fijo con 5 caracteres).
Detalles importantes que cambiar hay muchos, el primero que salta a la vista es:
int i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20;
No hay razón para ello primero porque puedes declarar las variables dentro de las funciones que las utilizan y segundo porque sus nombres no indican nada sobre su uso. Por ejemplo si yo quiero conocer la diferencia entre "i3" e "i5" no queda mas que revisar el código fuente a detalle.
----
Si reducimos el programa al mínimo este consiste en generar palabras en base a un abecedario. Supongamos que este abecedario consta de diez elementos y ellos son:
Si se desea generar todas las palabras de longitud tres estas son:
000
001
002
003
004
005
006
007
008
009
010
...
999
Como puedes ver con el ejemplo lo que en realidad se hace es procesar de alguna forma cada uno de los números con un numero de dígitos determinado y en una cierta base:
* El numero de dígitos lo indica la longitud de la palabra
* El carácter correspondiente a cada dígito lo dicta tu abecedario
* La base N no es mas que el numero de elementos de tu abecedario.
Hay varias formas de implementarlo, la mas sencilla en mi opinión es emulando un medidor de lo que sea (servicio eléctrico, kilometraje, etc.).
Un ejemplo sencillo en C utilizando un centinela (el ultimo elemento siendo igual al primero en el abecedario) para acortar el programa:
#include <stdio.h>
#include <stdlib.h>
#define MAX_LENGTH 3
void print_words(char const *abc, int length);
int main(void)
{
char abc[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' /* sentinel */};
int i;
for (i = 0; i < MAX_LENGTH; i++){
print_words(abc, i + 1);
}
return EXIT_SUCCESS;
}
void print_words(char const *abc, int length)
{
char *word;
int i;
if ((word
= malloc(length
)) == NULL
){ fputs("Women and children first!\n", stderr
); }
for (i = 0; i < length; i++)
word[i] = abc[0];
printf("Length: %d\n%.*s\n", length
, length
, word
);
while (1){
i = length;
while (i-- > 0){
word[i] = abc[word[i] - abc[0] + 1];
if (word[i] != abc[0])
break;
}
if (i == -1)
break;
else
printf("%.*s\n", length
, word
); }
}
Un saludo