Error en programa generar clave aleatoria

Iniciado por pacosn1111, 20 Mayo 2015, 22:04 PM

0 Miembros y 1 Visitante están viendo este tema.

pacosn1111

Hola a tod@s, acabo de escribir un simple código en C que te pregunta con un scanf de cuantos caracteres quieres la clave y te genera una clave aleatoria con mayusculas minusculas y números aleatorios, cuando uso un numero de caracteres alto como 25 todo va bien, pero cuando uso uno pequeño, como 5, obtengo lo siguiente:

x81Zw@

Es decir, esa arroba de más no se por que me aparece, dejo aquí el código:


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

void main() {

srand(time(NULL));

int cifras, x;
char min[]="abcdefghijklmnopqrstuvwxyz";
char may[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char num[]="0123456789";

printf("Escribe el número de cifras del string a crear...");
scanf("%d", &cifras);
printf("\n");

char aleatorio[cifras];

for(x; x<cifras; x++) {
int eleccion=(int)(rand() % 3+1);

switch ( eleccion ) {
case 1:
aleatorio[x]=min[rand() % 25+1];
break;
case 2:
aleatorio[x]=may[rand() % 25+1];
break;
case 3:
aleatorio[x]=num[rand() % 9+1];
break;
default:
continue;
}

aleatorio[cifras+1]='\0';
}
printf("%s\n", aleatorio);
}


Saludos.

DarK_FirefoX

No estas inicializando la variable x del ciclo, y te debe estar obteniendo un valor que esté almacenado en ese espacio en memoria. (el que esté)

Espero te ayude.

pacosn1111

Gracias por tu respuesta, pero ya lo he corregido y sigue dando el mismo fallo.

engel lex

#3
el codigo tiene una lista de errores...

1-
Código (cpp) [Seleccionar]
char aleatorio[cifras+1];

debe ser 1 más de largo para que puedas colocarle el caracter de terminación

2-
aquí es raro que no te diera error... estás accediendo a una posición invalida
Código (cpp) [Seleccionar]
aleatorio[cifras+1]='\0';


debe ser
Código (cpp) [Seleccionar]
aleatorio[cifras]='\0';

ya que el ciclo es x menor que cifras (nunca llega a cifras)

3-
lo tipico  con la linea 21 y el switch es que
int eleccion=(int)(rand() % 3)

y que el switch empieze en 0... sin embargo el metodo funciona, ya que se evalua primero el "%" y luego "+"

pero en 25, 28 y 31 tienes un error...
los array son de 26 y 10 de largo..

cuando haces
aleatorio[x]=num[rand() % 9+1];

se toma un numero entre 0 y 8, luego le sumas 1... así que "a", "A" y "0" nunca se darán

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

pacosn1111

Cita de: engel lex en 20 Mayo 2015, 22:56 PM
el codigo tiene una lista de errores...

1-
Código (cpp) [Seleccionar]
char aleatorio[cifras+1];

debe ser 1 más de largo para que puedas colocarle el caracter de terminación

2-
aquí es raro que no te diera error... estás accediendo a una posición invalida
Código (cpp) [Seleccionar]
aleatorio[cifras+1]='\0';


debe ser
Código (cpp) [Seleccionar]
aleatorio[cifras]='\0';

Gracias, solucionado.

ya que el ciclo es x menor que cifras (nunca llega a cifras)

3-
lo tipico  con la linea 21 y el switch es que
int eleccion=(int)(rand() % 3)

y que el switch empieze en 0... sin embargo el metodo funciona, ya que se evalua primero el "%" y luego "+"

pero en 25, 28 y 31 tienes un error...
los array son de 26 y 10 de largo..

cuando haces
aleatorio[x]=num[rand() % 9+1];

se toma un numero entre 0 y 8, luego le sumas 1... así que "a", "A" y "0" nunca se darán



engel lex

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

pacosn1111

Si, que ya estaba solucionado, pero sin darme cuenta he generado una cita en blanco.

Saludos.