2.
5.
Este crashea con alfabetos de mas de 18 caracteres y longitud 6
Alternativa:
			Código (c) [Seleccionar] 
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    FILE *f;
    char *contenido;
    unsigned long longitud;
    f=fopen("algunfichero","rb");
    fseek(f,0,SEEK_END);
    if(!(contenido = malloc(longitud = ftell(f))))
        return -1;
    fseek(f,0,SEEK_SET);
    fread(contenido,longitud,1,f);
    fclose(f);
    free(contenido);
    return 0;
}
5.
Este crashea con alfabetos de mas de 18 caracteres y longitud 6
Código (cpp) [Seleccionar] 
/*
 *  linea de comandos:
 *      nombreprograma alfabeto longitud
 */
#include <iostream>
#include <list>
#include <string>
#include <cstring>
#include <cstdlib>
using namespace std;
unsigned long convertir(char *s);
void bruteforce(list<string> &resultado,char *alfabeto,unsigned long longitud);
int main(int argc, char *argv[])
{
    list<string> resultado;
    unsigned long l;
    if(argc != 3)
    {
        cerr << argv[0] << " alfabeto longitud" << endl;
        return -1;
    }
    if(!(l = strlen(argv[1])))
    {
        cerr << argv[0] << " alfabeto longitud" << endl;
        return -1;
    }
    //eliminamos caracteres repetidos del alfabeto
    for(int i = 0 ; i < strlen(argv[1]) ; i++)
        if(strchr(argv[1] + i + 1 , argv[1][i]))
        {
            memmove(argv[1] + i ,argv[1] + i  + 1, (l--) - i );
            i--;
        }
    //nos aseguramos de que el segundo argumento sea numerico
    for(int i = 0 ; argv[2][i] ; i++)
        if(argv[2][i] < '0' || argv[2][i] > '9')
        {
            cerr << argv[0] << " alfabeto longitud" << endl;
            return -1;
        }
    bruteforce(resultado,argv[1],convertir(argv[2]));
    for(list<string>::iterator it = resultado.begin() ; it != resultado.end() ; it++)
        cout << (*it) << endl;
    return 0;
}
unsigned long convertir(char *s)
{
    unsigned long ret = 0;
    for(int i = 0 ; s[i] ; i++)
    {
        ret *= 10;
        ret += s[i] - '0';
    }
    return ret;
}
void bruteforce(list<string> &resultado,char *alfabeto,unsigned long longitud)
{
    static string cadena;
    static unsigned long posicion = 0;
    if(posicion == longitud)
    {
        //si hemos llegado a la ultima posicion almacenamos la variacion
        resultado.push_back(cadena);
        return;
    }
    //si es la primera llamada damos la longitud deseada a la cadena
    if(posicion == 0)
        cadena.resize(longitud);
    //para cada una de los caracteres del alfabeto
    for(int i = 0 ; alfabeto[i] ; i++)
    {
        cadena[posicion] = alfabeto[i]; //asignamos a la posicion correspondiente el caracter del alfabeto.
        //avanzamos una posicion
        posicion++;
        //y calculamos el siguiente caracter
        bruteforce(resultado , alfabeto , longitud);
        //volvemos a la posicion original
        posicion--;
    }
    //posicion termina a cero para la siguiente llamada
    if(!posicion)
        cadena.resize(0);
}
Alternativa:
Código (cpp) [Seleccionar] 
/*
 *  linea de comandos:
 *      nombreprograma alfabeto longitud
 */
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
using namespace std;
unsigned long convertir(char *s);
void bruteforce(char *alfabeto,unsigned long longitud);
int main(int argc, char *argv[])
{
    unsigned long l;
    if(argc != 3)
    {
        cerr << argv[0] << " alfabeto longitud" << endl;
        return -1;
    }
    if(!(l = strlen(argv[1])))
    {
        cerr << argv[0] << " alfabeto longitud" << endl;
        return -1;
    }
    //eliminamos caracteres repetidos del alfabeto
    for(int i = 0 ; i < strlen(argv[1]) ; i++)
        if(strchr(argv[1] + i + 1 , argv[1][i]))
        {
            memmove(argv[1] + i ,argv[1] + i  + 1, (l--) - i );
            i--;
        }
    //nos aseguramos de que el segundo argumento sea numerico
    for(int i = 0 ; argv[2][i] ; i++)
        if(argv[2][i] < '0' || argv[2][i] > '9')
        {
            cerr << argv[0] << " alfabeto longitud" << endl;
            return -1;
        }
    bruteforce(argv[1],convertir(argv[2]));
    return 0;
}
unsigned long convertir(char *s)
{
    unsigned long ret = 0;
    for(int i = 0 ; s[i] ; i++)
    {
        ret *= 10;
        ret += s[i] - '0';
    }
    return ret;
}
void bruteforce(char *alfabeto,unsigned long longitud)
{
    static string cadena;
    static unsigned long posicion = 0;
    if(posicion == longitud)
    {
        //si hemos llegado a la ultima posicion almacenamos la variacion
        cout << (cadena) << endl;
        return;
    }
    //si es la primera llamada damos la longitud deseada a la cadena
    if(posicion == 0)
        cadena.resize(longitud);
    //para cada una de los caracteres del alfabeto
    for(int i = 0 ; alfabeto[i] ; i++)
    {
        cadena[posicion] = alfabeto[i]; //asignamos a la posicion correspondiente el caracter del alfabeto.
        //avanzamos una posicion
        posicion++;
        //y calculamos el siguiente caracter
        bruteforce(alfabeto , longitud);
        //volvemos a la posicion original
        posicion--;
    }
    //posicion termina a cero para la siguiente llamada
    if(!posicion)
        cadena.resize(0);
}