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);
}