Problemas con scanf() en C

Iniciado por JairM, 19 Febrero 2017, 19:13 PM

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

JairM

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:

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

float m;
char d;
main(){
printf("Escribe tu valor en metros: ");
scanf("%f",&m);
printf("Este es tu valor en pies: %f\n",m*3.28084);
printf("\n¿Quieres hacer otra conversion?(S/N): ");
scanf("%c",&d);
scanf("%c",&d);
if (d=='S'){
       system("cls");
   return main();
}
       else {
           return 0;
   }
   }



· Los códigos deben ir en etiquetas GeSHi
>aquí las reglas del foro
-Engel Lex

KINGARZA

Solo tienes que limpiar el buffer

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

float m;
char d;

main(){
    printf("Escribe tu valor en metros: ");
    scanf("%f",&m);
    printf("Este es tu valor en pies: %f\n", m * 3.28084);
    printf("\n¿Quieres hacer otra conversion?(S/N): ");
    fflush(stdin);
    scanf("%c", &d);
    if(d == 'S' || d == 's'){
        system("cls");
        return main();
    }
    return 0;
}

Te dejo este link para que lo entiendas: http://www.carlospes.com/curso_de_lenguaje_c/01_11_la_funcion_fflush.php

engel lex

Lo que no hay que hacer en C/C++

Citar2) 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();
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.