scanf no funciona. necesito leer el doble desde la consola

2 minutos de lectura

No estoy seguro de lo que estoy haciendo mal, pero no puedo leer un doble desde la consola. Leer un funciona bien por alguna razón. Estoy usando Xcode.

double n1;

// get input from the user
printf("Enter first number: ");
scanf("%f", &n1);

printf("%f", n1);

Esto siempre imprimirá 0 sin importar lo que ingrese.

  • Posible duplicado de Variable de tipo doble que no funciona cuando se lee con scanf()

    – phuclv

    9 de septiembre de 2018 a las 4:32

%f está buscando un flotador, no un doble. Si desea utilizar un doble, utilice el formato %lf.

Como un aparte algo interesante, clang advierte sobre esto sin banderas adicionales, gcc 4.6 no lo advertirá incluso con -Wall -Wextra -pedantic.

  • Afortunadamente GCC 5.2.1-22ubuntu2 se queja sin ningún argumento

    – Antti Haapala — Слава Україні

    20 de marzo de 2016 a las 10:44

%f está destinado a un single precision floating-point value (flotador). El especificador de formato que necesita es %lfsentido long precision floating-point value (doble).

Se trata de cómo se almacenan los datos en la memoria.
Permítanme decirles primero cuánto tiempo y flotación se almacenan en la memoria.

  • Un doble (flotante largo, 64 bits) se almacena en la memoria como o esta (notación little endian).

  • Donde como un flotador (32 bits) se almacena como esta (notación little endian).
    También eche un vistazo a esto “en.wikipedia.org/wiki/Floating_point#Internal_representation” (todos los tipos de datos flotantes)

Así que aquí está pidiendo tomar entrada como %f (es decir, flotante, que es de 4 bytes pero el doble es de 8 bytes), por lo que el compilador toma la entrada de la consola y la convierte en tipo flotante y la almacena en la ubicación de la memoria (que en realidad es de 8 bytes) de la variable (aquí n1).

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad