Hola a todos

Le estoy dando vueltas a un programita en C y no encuentro el error. Teoricamente lo que quiero que haga es que saque una lista de combos con este formato: aaaaaa:aaaaaa
aaaaab:aaaaab......


Pero en realidad los saca asi: aaaaaa:aaaaaa
aaaaab:aaaaaa
aaaaac:aaaaaa......

Alguien puede ojear el codigo y darme alguna sugerencia??

Notese que soy un poco novato

Gracias de antemano

Código: Seleccionar todo

/*DICCIONARIO*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int desde;
int hasta;



void calcula (void);


int main()
{
	int ndopcion;
	
	printf("\n\n\t\t\t\tMENU\n\n");
	printf("\n\t\t1\tNumeroS\n\t\t2\tMayusculaS\n\t\t3\tMinusculaS\n\t\t4\tVaciO\n\t\t5\tVaciO\n");
	printf ("\nIntroduza numero de opcion: ");
	scanf (" %d" ,&ndopcion);
	while(getchar()!='\n');
	
		switch (ndopcion)
		{
			case 1:
					{
					desde=48;
					hasta=57;
						calcula();
					}
			break;
			
			case 2:
					{
						desde=65;
						hasta=90;
						calcula();
						
						}
			break;
			
			case 3:
					{
						desde=97;
						hasta=122;
						calcula();
						
						}
			break;
			
			case 4:
					{
					
				}
			break;
			
			case 5:
			{
					
				}
			break;
			}
		
		}
	
	void calcula (void)
	{

	int a, b, c, d, e, f;
char clv[14];
char combo[7];

char nombre[20];



	printf("\nIntroduzca nombre del archivo de salida: ");
	gets(nombre);
	while(getchar()!='\n');
 
	FILE *hoja1;
	hoja1 = fopen (nombre , "wt");
	if (hoja1 == NULL)
	{
	printf ("No se ha podido crear el fichero");
}
	else
	
		{
			
	
	for (a=desde; a<= hasta; a++)
	{
		
		clv[0] = a;
		combo[0]=a;
		for (b=desde; b <= hasta; b++)
		{
			clv[1] = b;
			combo[1]=b;
				for (c=desde; c<= hasta; c++)
    		{	
				clv[2] = c;
				combo[2]=c;
				for (d=desde; d<= hasta; d++)
				{	
					clv[3] = d;
					combo[3]=d;
						for (e=desde; e<=hasta; e++)
						{	
							clv[4] = e;
							combo[4]=e;
							
							for (f=desde; f<= hasta; f++)
							{	
								clv[5] = f;
								combo[5]=f;
								clv[6]=':';
								combo[6]='\n';
								  
								 strcat(clv, combo);
					
									fwrite (clv, sizeof(clv), 1, hoja1);
									printf("\n%s",clv);
					}	
			      }
			   }
			}
		}
	}
}
	fclose(hoja1);
	printf("\n%s", clv);
	printf("\nArchivo cerrado\n\n ");


}
Que recuerdos.. Esto lo tenia hecho hace mucho tiempo en pseudocódigo. Ahora lo busco, si lo encuentro te lo subo.

Saludos.
El secreto de mi éxito es Jesús
Amigo, no te preocupes, he visto peores codigos que el tuyo (muy pocos)

Bueh, dejando de lado el codee, y sin tocar lo que has hecho, hay un concepto que no tienes claro
y es que toda cadena de char en C DEBE terminar con un '\0'
Por lo cual, si vas a meter char a mano dentro de un array tienes que contemplar que el ultimo caracter de cada array sea el caracter nulo, ya que el concatenamiento se hace despues de ese caracter...
Empieza con eso, y despues depuramos lo que resta

Saludos
Imagen
Mis modestas opiniones:

// 1:
Estas seguro que quieres hacer ese programa? Generar todas las posibilidades entre aaaaaa y zzzzzz significa que estarás generando aproximadamente 27^6 = 387 millones de lineas. Vamos, que tu diccionario.txt será de casi 400 millones de líneas :P

Un poco menos de líneas generará con números, pero todo y así serán 9^6 = 531 mil líneas.

No creo que ningún PC aguante eso.

// 2:
No quiero meter fuego de C vs C++, pero para esta aplicación C++ me parece más cómodo, por qué no usarlo?

// 3:
Intenta evitar los magic numbers, imposibilitan la legibilidad de tu código y complican modificaciones ([Enlace externo eliminado para invitados])

En este caso tienes muy fácil evitar poner números. Por ejemplo:

Código: Seleccionar todo

desde   = '0';
hasta   = '9';
O:

Código: Seleccionar todo

desde   = 'A';
hasta   = 'Z';
// 4:
Intenta evitar a toda costa globales variables. Es mucho mejor declararlas en main (si es allí donde están relacionadas) y llevarlas a tu función mediante argumentos. Por ejemplo:
bool calcula(int desde, int hasta){ //bla; //ha ido bien: return 0; //ha ido mal return 1;}

Y en main la llamas: if(!calcula(desde, hasta)) //todo bien; else //mal;

// 5:
Te falla la cadena final porque tratas clv y combo de forma distinta (cuando en teoria quieres que tengan el mismo valor).
Si quieres el mismo valor, usa strcpy!

Yo también estoy aprendiendo a programar, si alguien se une a la fiesta bienvenido y ánimos :)
Responder

Volver a “C/C++”