Scanf/Printf doble variable C

4 minutos de lectura

avatar de usuario
Dragos Rizescu

Digamos que tengo este siguiente código en C:

double var;
scanf("%lf", &var);
printf("%lf", var);
printf("%f", var);

Lee desde la variable stdin ‘var’ y luego imprime dos veces en stdout ‘var’. Entiendo que así es como lees una variable doble de stdin, pero mis preguntas son:

  1. ¿Por qué puedes imprimir un doble con %lf?
  2. ¿Por qué puedes imprimir un doble con %f?
  3. ¿Cuál es mejor y correcto de usar?

  • En printf Ellos son iguales.

    – Marún

    13 de noviembre de 2013 a las 11:15

  • scanf toma sugerencias, que no se pueden promocionar, pero printf toma valores que pueden. en términos de impresión, probablemente usaría %lf ya que es más claro para cualquiera que lea su código.

    – robbie_c

    13 de noviembre de 2013 a las 11:16


  • Posible duplicado de ¿Por qué scanf() necesita “%lf” para dobles, cuando printf() está bien con solo “%f”?

    – phuclv

    9 de septiembre de 2018 a las 4:34

avatar de usuario
yuhao

Para funciones de argumento variable como printf y scanflos argumentos se promocionan, por ejemplo, cualquier tipo de entero más pequeño se promociona a int, float es ascendido a double.

scanf toma parámetros de punteros, por lo que la regla de promoción no tiene efecto. debe usar %f por float* y %lf por double*.

printf nunca verá un float argumento, float siempre es ascendido a double. El especificador de formato es %f. Pero C99 también dice %lf es lo mismo que %f en printf:

C99 §7.19.6.1 El fprintf función

l (ell) Especifica que un siguiente d, i, o, u, xo X El especificador de conversión se aplica a un long int o unsigned long int argumento; que un siguiente n El especificador de conversión se aplica a un puntero a un long int argumento; que un siguiente c El especificador de conversión se aplica a un wint_t argumento; que un siguiente s El especificador de conversión se aplica a un puntero a un wchar_t argumento; o no tiene efecto en un siguiente a, A, e, E, f, F, go G especificador de conversión.

Cuando una float se pasa a printfse convierte automáticamente en un double. Esto es parte de la promociones de argumento predeterminadoque se aplican a funciones que tienen una lista de parámetros variables (que contiene ...), en gran parte por razones históricas. Por lo tanto, el especificador “natural” para un float, %fdebe trabajar con un double argumento. Entonces el %f y %lf especificadores para printf son lo mismo; ambos toman un double valor.

Cuándo scanf se llama, se pasan punteros, no valores directos. un puntero a float no se convierte en un puntero a double (esto podría no funcionar ya que el objeto apuntado no puede cambiar cuando cambia el tipo de puntero). Entonces, para scanfel argumento a favor %f debe ser un indicador de floaty el argumento a favor %lf debe ser un indicador de double.

Por lo que leí en las páginas del manual, scanf dice que el modificador de longitud ‘l’ indica (en el caso de los puntos flotantes) que el argumento es de tipo double en lugar de tipo float, por lo que puede tener ‘lf, le, lg’.

En cuanto a la impresión, oficialmente, el manual dice que ‘l’ se aplica solo a tipos enteros. Por lo tanto, es posible que no sea compatible con algunos sistemas o con algunos estándares. Por ejemplo, recibo el siguiente mensaje de error al compilar con gcc -Wall -Wextra -pedantic

a.c:6:1: warning: ISO C90 does not support the ‘%lf’ gnu_printf format [-Wformat=]

Por lo tanto, es posible que desee verificar dos veces si su estándar es compatible con la sintaxis.

Para concluir, diría que lees con ‘%lf’ e imprimes con ‘%f’.

  • Si uno usa las especificaciones C99 y C11 como “oficialmente”, dicen “l … no tiene efecto en el siguiente especificador de conversión a, A, e, E, f, F, g o G”.

    – chux – Reincorporar a Monica

    13 de noviembre de 2013 a las 13:27

  • ¿Qué es “el manual”? Esta no es una referencia útil sin un título y una versión. Además, el año actual es 2013, por lo que se debe desaconsejar el uso de especificaciones de software de 1990 cuando hay versiones más modernas disponibles.

    –Eric Postpischil

    13 de noviembre de 2013 a las 14:28

¿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