2012-07-26 14 views
7

Estoy tratando de aprender C y he creado el siguiente pequeño programa.Programming Data Types

#include "stdafx.h" 

void main() 
{ 
    double height = 0; 
    double weight = 0; 
    double bmi = 0; 

    printf("Please enter your height in metres\n"); 
    scanf_s("%f", &height); 
    printf("\nPlease enter your weight in kilograms\n"); 
    scanf_s("%f", &weight); 
    bmi = weight/(height * height); 
    printf("\nYour Body Mass Index stands at %f\n", bmi); 
    printf("\n\n"); 
    printf("Thank you for using this small program. Press any key to exit"); 
    getchar(); 
    getchar(); 
} 

El programa compila perfectamente, pero la respuesta que devuelve el programa no tiene sentido. Si ingreso 1.8 para la altura y 80 para el peso, la bmi es como 1. # NF00 que no tiene sentido.

¿Qué estoy haciendo mal?

+10

¿No es '% lf' en dobles? En cualquier caso, [no debe usar 'void main'.] (Http://stroustrup.com/bs_faq2.html#void-main) – chris

+0

@chris es bueno saberlo. Siempre me enseñaron que 'void main' era para C, y' int main' para C++. Me pregunto de dónde viene el hábito de los nuevos programadores C/C++ para hacer esto. – Darthfett

+0

@Darthfett, creo que hay algunos libros que usan 'void main'. Me imagino que es de donde se está transmitiendo todo esto. – chris

Respuesta

10

scanf (y scanf_s) El formato %f espera que el puntero escriba float.

Simplemente cambie el tipo de sus variables height y weight al float para solucionarlo.

+0

Gracias :) ¡Eso funcionó perfectamente! Utilicé% f ya que el tutorial que estaba siguiendo usó% f para el doble. – Matthew

+1

@Matthew Creo que es hora de obtener un nuevo tutorial. –

+0

Supongo que sí: s Gracias de nuevo :) – Matthew

4

Creo cuestión en scanf_s sintaxis, se omite, el argumento 3-er, que es el tamaño de búfer en bytes. Pruebe lo siguiente:

scanf_s("%lf", &valueToGet, sizeof(double)); 
+1

Uhm, él no está escaneando un "char" aquí, usted sabe –

+0

sí, sé que este es solo un ejemplo para mostrar qué 3er argumento es necesario, el cual tomé rápidamente de msdn, ya que traté de responder rápidamente en la respuesta que no ajustar ese ejemplo en la tarea dada, perdón por eso)) –

+0

Presumiblemente estás hablando de 'scanf_s', pero has escrito' scanf'? Además, el especificador de formato es incorrecto. Por favor, corrija los errores o elimine la respuesta. –

3

el inconveniente de la scanf() y printf() es que requiere formato muy estricto, cualquier desajuste entre la cadena de control y el argumento puede causar un error drástica que hace que su entrada o salida no hacen sentido en absoluto. Y ese error a menudo es hecho por principiantes.

2

Si usa el especificador de formato % f, debe usar el tipo de datos float en lugar del doble.

0

El problema se debe a que:

format '%f' expects argument of type 'float*', but argument 2 has type 'double*' 

Hay dos maneras de manejar esta situación:

  1. Cualquiera de las variables deben ser float:

    double height = 0; --> float height = 0; 
    double weight = 0; --> float weight = 0; 
    double bmi = 0;  --> float bmi = 0; 
    
  2. o la format specifier debe corresponde a double.

    scanf_s("%f", &height); --> scanf_s("%lf", &height); 
    
    scanf_s("%f", &weight); --> scanf_s("%lf", &weight); 
    
    printf("\nYour Body Mass Index stands at %f\n", bmi); 
                  | 
                  V 
    printf("\nYour Body Mass Index stands at %lf\n", bmi);