Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: juntacadaveres en 12 Junio 2020, 20:24 pm



Título: Problema con bucle while
Publicado por: juntacadaveres en 12 Junio 2020, 20:24 pm
(https://i.imgur.com/PKo98it.png)

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


Título: Re: Problema con bucle while
Publicado por: K-YreX en 12 Junio 2020, 20:43 pm
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:
Código
  1. 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


Título: Re: Problema con bucle while
Publicado por: MAFUS en 14 Junio 2020, 16:03 pm
Seguramente capturas el '\n' de la tecla INTRO. Hay mucha documentación sobre esto, tanto en el foro como en la internet.


Título: Re: Problema con bucle while
Publicado por: EmaTomA en 9 Julio 2020, 12:46 pm
(https://i.ibb.co/KjtyxTP/code.png)

Aqui tienes la solucion a tu problema  ;D


MOD: Imagen redimensionada al tamaño permitido


Título: Re: Problema con bucle while
Publicado por: K-YreX en 9 Julio 2020, 16:44 pm
(https://i.ibb.co/KjtyxTP/code.png)

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:
Código
  1. #include <stdio.h>
  2.  
  3. const int CLAVE = 123;
  4.  
  5. int main(){
  6.    int clave_usuario;
  7.    int clave_correcta; // se puede usar bool incluyendo la cabecera <stdbool.h>
  8.    do {
  9.        printf("Introduce la contrasena: ");
  10.        scanf("%d", &clave_usuario);
  11.        while(getchar() != '\n'); // limpieza de buffer
  12.        clave_correcta = (CLAVE == clave_usuario);
  13.        if(!clave_correcta) {
  14.            printf("** La contrasena es incorrecta **\n");
  15.        }
  16.    while(!clave_correcta);
  17.    printf("** La contrasena es correcta **\n");
  18.    getchar(); // pausa para que no se cierre la consola si se ejecuta el exe directamente
  19.    return 0;
  20. }

PD: Los códigos mejor entre etiquetas de Código GeSHi  :rolleyes:


Título: Re: Problema con bucle while
Publicado por: Eternal Idol en 9 Julio 2020, 17:53 pm
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.