Bueno, sin mas, un codigo como el anterior pero un poco mas complejo ;).
Metodo de uso dic [longitud del diccionario] (opcional)[caracteres del diccionario]
Si no se especifica el 2º parametro, se utilizaran los que vienen por defecto osea, "abcdefghijklmnopqrstuvwxyz".
Sin mas explicacion, el codigo.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{ if(argc < 2 || !strcmp(argv[1], "-h")) //Texto de ayuda
{
puts("HELP: \nsintax: dic [len_dic] (optional)[list]");
return 1;
}
int len=0, cont=atoi(argv[1]), *cad, i, ver=1; //Declaracion
cad=(int *)malloc(sizeof(int) * atoi(argv[1])); //Reserva de memoria para un array int
memset((int *)cad,0,sizeof(int) * atoi(argv[1]));//Inicializamos el array a 0
char *lst;//Declaracion de la lista que contendra las posibilidades
if(argc < 3) //Comprobamos el numero de parametros introducidos para hacer una cosa u otra
{
lst=(char *)malloc(strlen("abcdefghijklmnopqrstuvwxyz")+1);
strcpy(lst, "abcdefghijklmnopqrstuvwxyz");
}
else if(argc == 3)
{
lst=(char *)malloc(strlen(argv[2])+1);
if(!lst)
{
puts("No se pudo reservar la memoria");
return 1;
}
strcpy(lst, argv[2]);
}
while(len+1<=cont)//Comienza el ciclo de generacion
{
if(lst[cad[0]]!='\0')
{
for(i=0;i<=len;i++)
{
putchar(lst[cad[i]]);
}
putchar('\n');
}
if(lst[cad[0]]!='\0')
{
cad[0]++;
}
else
{
ver=0;
for(i=0;i<=len;i++)
{
if(lst[cad[i]]=='\0')
{
cad[i]=0;
cad[i+1]++;
}
else
{
ver=1;
}
}
}
if(ver==0)
{
len++;
for(i=0;i<=len;i++)
{
cad[i]=0;
}
ver=1;
}
}
free(lst);
free(cad);
return 0;
}
Sa1uDoS
P.D.: Mejorado para Luxur, el SO de Taul.