No reconoce contraseña

Iniciado por Baal_30, 6 Julio 2014, 11:50 AM

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

Baal_30

Muy buenas, con el fin de ir practicando y aprendiendo, me he puesto a crear una especie de jueguecito, y lo primero que he hecho ha sido crear un menu, para crear tu cuenta y luego ingresar con ella, (una chorrada ya que por ahora será de un solo jugador, pero para ir manejando el asunto), el problema está en que cuando se supone que he creado una cuenta, luego al ingresar con ella me dice dice que el nombre o la pass son incorrectos (no es que sean incorrectos, sino que directamente no reconoce lo que he creado antes), supongo que el problema será que cuando "creo" la nueva cuenta, no se me guarda correctamente en la variable, o quizás que no busque bien donde está la contraseña nueva, no tengo ni idea. Aquí tenéis el código, segurísimo que tendré mil fallos, pero espero ir poco a poco corrigiendo y aprendiendo. Gracias de antemano.

#include <stdio.h>

int menu();
int menujuego();

main(){

    menu();
     
     
}

int menu(){
    int op;
    char nombre[20], nombre1[20];
    char pass[20], pass1[20];
    char m;
     
    printf("(1) Entrar a su cuenta\n");
    printf("(2) Crear nueva cuenta\n");
    scanf("%d",&op);
     
    switch(op){
        case 1 :
            system("cls");
            printf("Introduzca el nombre de su cuenta:  ");
            fflush(stdin);
            gets(nombre);
            printf("Introduzca la contrasena:  ");
            fflush(stdin);
            gets(pass);
             
            if(nombre == *nombre1 && pass == *pass1){
                menujuego();
            }
            else{
            while(nombre != *nombre1 || pass != *pass1){
                system("cls");
                printf("Nombre o contrasena incorrectos, intenta de nuevo. \n");
                printf("Introduzca el nombre de su cuenta:  ");
                fflush(stdin);
                gets(nombre);
                printf("Introduzca la contrasena:  ");
                fflush(stdin);
                gets(pass);
                }
            }
            break;
        case 2 :
            system("cls");
            printf("Introduzca su nombre para la nueva cuenta:  ");
            fflush(stdin);
            gets(nombre1);
            printf("Introduzca la contrasena:  ");
            fflush(stdin);
            gets(pass1);   
             
            while(m!='M'){
            system("cls");
            printf("Cuenta creada con exito. Pulsa \"M\" para volver al menu: \n");
            scanf("%c",&m);
        }
            system("cls");
            if(m == 'M'){
                menu();
            }
            break;
        default :
            system("cls");
            printf("Elija una opcion correcta. \n");
            menu();
    }
     
    return op;
}

int menujuego(){
    system("cls");
    printf("MENU\nMENU\nMENU\nMENU");
}
«La suerte es el cuidado de los detalles». -Winston Churchill

leosansan

Cita de: Baal_30 en  6 Julio 2014, 11:50 AM
............l problema está en que cuando se supone que he creado una cuenta, luego al ingresar con ella me dice dice que el nombre o la pass son incorrectos (no es que sean incorrectos, sino que directamente no reconoce lo que he creado antes), supongo que el problema será que cuando "creo" la nueva cuenta, no se me guarda correctamente en la variable, o quizás que no busque bien donde está la contraseña nueva........

Estas comparando cadenas con:

Código (cpp) [Seleccionar]
if(nombre == *nombre1 && pass == *pass1)

Y eso es sólo para caracteres o números. Tendrías que usar, tanto en el if com en el while:

Código (cpp) [Seleccionar]
if(strcmp (nombre , nombre1)!=0  || strcmp (pass , pass1)!=0)

Con la función "strcmp " de la librería string.h.

Deberías leerte Lo que no hay que hacer en C/C++. Nivel basico donde se explica porqué no se debe usar gets y fflush(stdin).

¡¡¡¡ Saluditos! ..... !!!!



Baal_30

#2
Muchas gracias leosansan! Ahora mismo pruebo con strcmp  :) y gracias por el link, ya me lo había mirado, pero me surgían más dudas.

Por ejemplo, para usar fgets en vez de scanf, sería así :

scanf("%d",&op);

cambiarlo por :

fgets(op, 1, stdin);

¿Sería así? Y, al declarar op, se pondría : int op; de forma normal ¿?


Edito: He probado con el código que me comentas, y de esa forma accede al menu del juego con cualquier combinación, da igual que sea la cuenta creada o no. ¿Como lo tengo que poner para que compare el nombre que se escribe con el nombre de la cuenta que se ha creade anteriormente?
«La suerte es el cuidado de los detalles». -Winston Churchill

leosansan

#3
Cita de: Baal_30 en  6 Julio 2014, 13:06 PM
Muchas gracias leosansan! Ahora mismo pruebo con strcmp  :) y gracias por el link, ya me lo había mirado, pero me surgían más dudas.
.............................
Edito: He probado con el código que me comentas, y de esa forma accede al menu del juego con cualquier combinación, da igual que sea la cuenta creada o no. ¿Como lo tengo que poner para que compare el nombre que se escribe con el nombre de la cuenta que se ha creada anteriormente?

Lo del scanf para op lo dejaría como está, aunque sería más correcto validar dicha entrada.

Sorry, pero copié y pegué mal:

Código (cpp) [Seleccionar]
if((strcmp (nombre , nombre1))==0  && (strcmp (pass , pass1))==0)
..........................
while(strcmp (nombre , nombre1)!=0  || strcmp (pass , pass1)!=0)


Además deberías declarar las variables  nombre1 y pass1 con el prefijo static para que mantengan el valor al ser invocadas nuevamente por la función:

Código (cpp) [Seleccionar]
char nombre[20], pass[20];
static char nombre1[20], pass1[20];


¡¡¡¡ Saluditos! ..... !!!!



EDITO:

Se me olvidó comentarte que main es de tipo int y lleva al final el correspondiente return:

Código (cpp) [Seleccionar]
int main(){
   menu();
   return 0;
}

Baal_30

Uff que grande leosansan. Ahora va genial.

Lo que no entiendo muy bien es lo de static, así, ¿sin static, no mantendrían el valor? ¿que valor tendrían entonces?

Y lo de main, creía que no había que poner int, y si es main, ¿dónde devuelve el valor de return?

Gracias!!!!
«La suerte es el cuidado de los detalles». -Winston Churchill

leosansan

Cita de: Baal_30 en  6 Julio 2014, 14:48 PM
Uff que grande leosansan. Ahora va genial.

Lo que no entiendo muy bien es lo de static, así, ¿sin static, no mantendrían el valor? ¿que valor tendrían entonces?

Y lo de main, creía que no había que poner int, y si es main, ¿dónde devuelve el valor de return?

Gracias!!!!

Lo del static es para que en llamadas sucesivas a la función no se pierdan los valores de las variables declaradas como static.

Si no lo hicieras así en la nueva llamada a la función esas variables contendrían "basura". Haz la prueba y quita lo de static y veras que aunque entres los mismos valores para las variables correspondientes el programa dice que no son iguales de manera continua y es que perderías los valores previamente introducidos por valores impredecibles. Es como si no hubieras introducido los valores anteriores y claro las variables apuntan a direcciones cualesquiera.

Y lo del main es porque el estándar de C/C++ lo establece así y punto. Es más, si te fijas el compilador debe lanzar un "warning" alertando sobre ello.


Baal_30

Okey, todo clarito ;) Muchas gracias por la ayuda, un abrazo!
«La suerte es el cuidado de los detalles». -Winston Churchill