Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: m@o_614 en 12 Febrero 2012, 06:43 AM

Título: problema con while
Publicado por: m@o_614 en 12 Febrero 2012, 06:43 AM
Tengo un problema con mi programa en la opcion numero 1 que me pide todos los datos para registrarme y despues me vuelve a pedir la contraseña, si esta contraseña coincide con la del registro ingresa y si no entra en el ciclo while hasta darle la correcta. Pero nunca sale del while y no se por que :-(

de antemano gracias

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

typedef struct
{
    char nombre[20];
    char apellidos[20];
    char ciudad[15];
    char pais[15];
    char escuela[25];
    char correo_elect1[15];
    char correo_elect2[15];
    char contrasenia[10];
    int edad;
    char cumpleanios[10];

}registro;

int main()
{
    registro info_p;
    int opcion,situacion;
    char resp;
    printf("Menu\n");
    printf("1)Registrar cuenta\n");
    printf("2)Editar perfil\n");
    printf("3)Mensajes o Notificaciones\n");
    printf("4)Salir\n");
    do
    {
        printf("Elige una opcion:\n");
        scanf("%d",&opcion);
        switch(opcion)
        {
            case 1: printf("Registrarse \n");
                    printf("Nombre\n");
                    fflush(stdin);
                    gets(info_p.nombre);
                    printf("Apellidos\n");
                    fflush(stdin);
                    gets(info_p.apellidos);
                    printf("Correo Electronico\n");
                    fflush(stdin);
                    gets(info_p.correo_elect1);
                    printf("Contrasenia\n");
                    fflush(stdin);
                    gets(info_p.contrasenia);
                    printf("Pais\n");
                    fflush(stdin);
                    gets(info_p.pais);
                    printf("Ciudad\n");
                    fflush(stdin);
                    gets(info_p.ciudad);
                    printf("Edad\n");
                    fflush(stdin);
                    scanf("%d",&info_p.edad);
                    printf("\nBienvenid@ %s!!\n\n",info_p.nombre);
                    printf("Ingresar\n");
                    printf("Dame correo\n");
                    fflush(stdin);
                    gets(info_p.correo_elect2);
                    while(info_p.correo_elect1!=info_p.correo_elect2)
                    {
                        printf("Intentalo otra vez\n");
                        fflush(stdin);
                        gets(info_p.correo_elect2);
                    }
                    printf("El correo es el correcto\n");
                    break;
            case 2: printf("Editar perfil\n");
                    printf("Situacion sentimental\n\n");
                    printf("Elige:\n");
                    printf("1)Soltero\n");
                    printf("2)Casado\n");
                    printf("3)Union libre\n");
                    scanf("%d",&situacion);
                    switch(situacion)
                    {
                        case 1: printf("Soltero\n");
                                break;
                        case 2: printf("Casado\n");
                                break;
                        case 3: printf("Union libre\n");
                                break;
                        default:printf("No mostrar situacion sentimental\n");
                    }
                    printf("Formacion Academica\n");
                    fflush(stdin);
                    gets(info_p.escuela);
                    printf("Cumpleanios\n");
                    fflush(stdin);
                    gets(info_p.cumpleanios);
                    break;
            case 3: printf("Mensajes o Notificaciones\n");
                    printf("Quiere escribir un mensaje? (S/N)\n");
                    scanf("%c",&resp);
                    if(resp=='S')
                       printf("Escriba el mensaje\n");
                    else
                    if(resp=='N')
                       printf("Leer notificaciones\n");
                    else
                       printf("Error\n");
                    break;
            case 4: printf("Salir\n");
                    break;
        }
    }while(opcion!=4);
    return 0;
}
Título: Re: problema con while
Publicado por: x64core en 12 Febrero 2012, 06:58 AM
Comparar cadenas usa la funcion strcmp de la lib string.h
Título: Re: problema con while
Publicado por: Ferno en 12 Febrero 2012, 16:50 PM
Como te dijeron, la condición del while no estás bien porque estás comparando cadenas. Para comparar cadenas se utiliza la función strcmp.

http://c.conclase.net/librerias/?ansifun=strcmp

Con respecto al código, no utilices fflush(stdin), dicha función sólo se utiliza para archivos de salida.

http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html
Título: Re: problema con while
Publicado por: m@o_614 en 12 Febrero 2012, 22:38 PM
ya estoy utilizando el strncmp, la primera vez que le ingreso el correo si es correcto compila correctamente, pero cuando lo ingreso mal a la hora del segundo intento no importa si le ingreso el correo correcto el ciclo nunca se detiene

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

typedef struct
{
    char nombre[20];
    char apellidos[20];
    char ciudad[15];
    char pais[15];
    char escuela[25];
    char correo_elect1[15];
    char correo_elect2[15];
    char contrasenia[10];
    int edad;
    char cumpleanios[10];

}registro;

int main()
{
    registro info_p;
    int opcion,situacion,i;
    printf("Menu\n");
    printf("1)Registrar cuenta\n");
    printf("2)Editar perfil\n");
    printf("3)Mensajes o Notificaciones\n");
    printf("4)Salir\n");
    do
    {
        printf("Elige una opcion:\n");
        scanf("%d",&opcion);
        switch(opcion)
        {
            case 1: printf("Registrarse \n");
                    printf("Nombre\n");
                    fflush(stdin);
                    gets(info_p.nombre);
                    printf("Apellidos\n");
                    fflush(stdin);
                    gets(info_p.apellidos);
                    printf("Correo Electronico\n");
                    fflush(stdin);
                    gets(info_p.correo_elect1);
                    printf("Contrasenia\n");
                    fflush(stdin);
                    gets(info_p.contrasenia);
                    printf("Pais\n");
                    fflush(stdin);
                    gets(info_p.pais);
                    printf("Ciudad\n");
                    fflush(stdin);
                    gets(info_p.ciudad);
                    printf("Edad\n");
                    fflush(stdin);
                    scanf("%d",&info_p.edad);
                    printf("\nBienvenid@ %s!!\n\n",info_p.nombre);
                    printf("Ingresar\n");
                    printf("Dame correo\n");
                    fflush(stdin);
                    gets(info_p.correo_elect2);
                    i=strncmp(info_p.correo_elect1,info_p.correo_elect2,15);
                    while(i!=0)
                    {
                        printf("Intentalo otra vez\n");
                        fflush(stdin);
                        gets(info_p.correo_elect2);
                    }
                    printf("El correo es el correcto\n");
                    break;
            case 2: printf("Editar perfil\n");
                    printf("Situacion sentimental\n\n");
                    printf("Elige:\n");
                    printf("1)Soltero\n");
                    printf("2)Casado\n");
                    printf("3)Union libre\n");
                    scanf("%d",&situacion);
                    switch(situacion)
                    {
                        case 1: printf("Soltero\n");
                                break;
                        case 2: printf("Casado\n");
                                break;
                        case 3: printf("Union libre\n");
                                break;
                        default:printf("No mostrar situacion sentimental\n");
                    }
                    printf("Formacion Academica\n");
                    fflush(stdin);
                    gets(info_p.escuela);
                    printf("Cumpleanios\n");
                    fflush(stdin);
                    gets(info_p.cumpleanios);
                    break;
            case 3: printf("Mensajes o Notificaciones\n");
                    printf("Quiere escribir un mensaje? (S/N)\n");
                    break;
            case 4: printf("Salir\n");
                    break;
        }
    }while(opcion!=4);
    return 0;
}


estas fueron las modificaciones que hice :(
Título: Re: problema con while
Publicado por: HdM en 12 Febrero 2012, 23:32 PM
Buenas.

i=strncmp(info_p.correo_elect1,info_p.correo_elect2,15);
                    while(i!=0)
                    {
                        printf("Intentalo otra vez\n");
                        fflush(stdin);
                        gets(info_p.correo_elect2);
                    }


Si te fijas, la variable i sólo toma valor antes del bucle. Podrías hacer la comparación, como condición del while, ahorrándote el uso de una variable :

while(strncmp(info_p.correo_elect1,info_p.correo_elect2,15)!=0)

o meter la comparación dentro del while:


i=strncmp(info_p.correo_elect1,info_p.correo_elect2,15);
                    while(i!=0)
                    {
                        printf("Intentalo otra vez\n");
                        fflush(stdin);
                        gets(info_p.correo_elect2);
                         i=strncmp(info_p.correo_elect1,info_p.correo_elect2,15);
                    }


Saludos.