Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: JairM en 19 Febrero 2017, 19:13 pm



Título: Problemas con scanf() en C
Publicado por: JairM en 19 Febrero 2017, 19:13 pm
Hola. Tengo un problema, estoy realizando una pequeña practica para la escuela, y necesito que se repita un programa cuando el ususario responda S o N a la pregunta "¿Quieres hacer otra conversión?". El problema es que cuando compilo (Uso CodeBlocks) tengo que poner dos veces el scanf(), de otro modo el programa finaliza y no me deja escanear el valor de la respuesta (S/N).
Aquí está mi codigo:

Código
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3.  
  4. float m;
  5. char d;
  6. main(){
  7. printf("Escribe tu valor en metros: ");
  8. scanf("%f",&m);
  9. printf("Este es tu valor en pies: %f\n",m*3.28084);
  10. printf("\n¿Quieres hacer otra conversion?(S/N): ");
  11. scanf("%c",&d);
  12. scanf("%c",&d);
  13. if (d=='S'){
  14.        system("cls");
  15.    return main();
  16. }
  17.        else {
  18.            return 0;
  19.    }
  20.    }
  21.  


· Los códigos deben ir en etiquetas GeSHi
>aquí las reglas del foro (http://foro.elhacker.net/reglas.htm)
-Engel Lex


Título: Re: Problemas con scanf() en C
Publicado por: KINGARZA en 19 Febrero 2017, 20:32 pm
Solo tienes que limpiar el buffer
Código
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3.  
  4. float m;
  5. char d;
  6.  
  7. main(){
  8.    printf("Escribe tu valor en metros: ");
  9.    scanf("%f",&m);
  10.    printf("Este es tu valor en pies: %f\n", m * 3.28084);
  11.    printf("\n¿Quieres hacer otra conversion?(S/N): ");
  12.    fflush(stdin);
  13.    scanf("%c", &d);
  14.    if(d == 'S' || d == 's'){
  15.        system("cls");
  16.        return main();
  17.    }
  18.    return 0;
  19. }
  20.  
Te dejo este link para que lo entiendas: http://www.carlospes.com/curso_de_lenguaje_c/01_11_la_funcion_fflush.php


Título: Re: Problemas con scanf() en C
Publicado por: engel lex en 19 Febrero 2017, 20:36 pm
Lo que no hay que hacer en C/C++ (http://wiki.elhacker.net/programacion/cc/articulos/lo-que-no-hay-que-hacer-en-c-c)

Citar
2) fflush(stdin);

fflush(stdin) es un invitado casi diario. Pocas veces pasa un dia sin que alguien lo recomiende o lo mencione como la solucion! a los malos comportamientos de las pausas en los programas.

STDIN, como su nombre lo indica, significa 'Standard input'. Es decir, el ingreso por teclado.

Acorde al Standard, fflush espera solamente un stream de salida (STDOUT: 'Standard Output) por lo que el comportamiento con streams de entrada como STDIN es indefinido. Por mas que en algunas plataformas funcione, o que en algunos compiladores funcione, no deberia ser utilizado.

Por el otro lado, para evitar esas pausas fastidiosas es necesario evitar las funciones que dejan basura por doquier (como scanf();) y utilizar funciones como la ya mencionada fgets();