Problema con bucle while

Iniciado por juntacadaveres, 12 Junio 2020, 20:24 PM

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

juntacadaveres



Se supone que debe pedir al usuario la contraseña hasta que escriba la correcta pero no hace una pausa para que se pueda introducir la contraseña

se sala la sentencia scanf



MOD: Imagen redimensionada al tamaño permitido

K-YreX

Seguramente ese error aparezca solo al introducir caracteres alfabéticos (letras).
Esto sucede porque lo estás intentando guardar como un entero.

Si quieres aceptar cualquier entrada de caracteres tendrás que usar fgets() y recoger la entrada como una cadena de caracteres y luego ya manejarlo a tu manera: convirtiendo la clave en cadena o convirtiendo la entrada en número (comprobando claro que son caracteres numéricos).


Otro tema aparte es el uso de fflush(stdin) para limpiar el buffer de entrada. Esta función fue diseñada para limpiar el buffer de salida fflush(stdout) y no está hecha para el de entrada. Para limpiar el buffer de entrada utiliza otras opciones como:

while(getchar() != '\n');


Puedes aprovechar el código anterior para limpiar el buffer en caso de introducir caracteres. También se corregirá tu problema sin tener que usar fgets().

Suerte. :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

MAFUS

Seguramente capturas el '\n' de la tecla INTRO. Hay mucha documentación sobre esto, tanto en el foro como en la internet.

EmaTomA

#3


Aqui tienes la solucion a tu problema  ;D



MOD: Imagen redimensionada al tamaño permitido

K-YreX

Cita de: EmaTomA en  9 Julio 2020, 12:46 PM


Aqui tienes la solucion a tu problema  ;D



MOD: Imagen redimensionada al tamaño permitido

Te sugiero los siguientes cambios para ese código:
  • No utilizar fflush(stdin) para limpiar el buffer de entrada. Ya lo comenté en el otro mensaje.
  • No utilizar funciones de adorno como system("cls"). Además del gasto de recursos que conlleva hacer llamadas al sistema, al incluir un comando propio del sistema operativo, el programa pierde portabilidad (una forma de mantener la portabilidad es incluir muchos saltos de línea para limpiar la pantalla)
  • No utilizar system("pause") para hacer la pausa final. En C se recomienda usar getchar() (de <stdio.h>) y en C++, cin.get() (de <iostream>).
  • La implementación del bucle no me parece la mejor... Un condicional con un do-while() infinito dentro que tiene un break dentro de otro condicional para salir...

    Mi solución, con las recomendaciones anteriores sería:

    #include <stdio.h>

    const int CLAVE = 123;

    int main(){
        int clave_usuario;
        int clave_correcta; // se puede usar bool incluyendo la cabecera <stdbool.h>
        do {
            printf("Introduce la contrasena: ");
            scanf("%d", &clave_usuario);
            while(getchar() != '\n'); // limpieza de buffer
            clave_correcta = (CLAVE == clave_usuario);
            if(!clave_correcta) {
                printf("** La contrasena es incorrecta **\n");
            }
        while(!clave_correcta);
        printf("** La contrasena es correcta **\n");
        getchar(); // pausa para que no se cierre la consola si se ejecuta el exe directamente
        return 0;
    }


    PD: Los códigos mejor entre etiquetas de Código GeSHi  :rolleyes:
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Eternal Idol

El usuario que abrio el hilo ya no volvio asi que ya es suficiente. Y en general por favor tratemos de no dejar soluciones completas.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón