tabla significa que programacion para lenguaje formato especificadores especificador cadenas c++ c

c++ - programacion - que significa 163 en c



¿Qué es el especificador de formato para `largo doble` (4)

Estoy trabajando en una aplicación que funciona en varios tipos de sistemas operativos Unix y Windows de 32 bits y 64 bits.

Estoy usando el tipo de datos long double . Cuando hago sprintf() y uso el long double con %lf , entonces funciona bien con Windows, no da ningún tipo de error, sin embargo, en la plataforma Solaris da un volcado de memoria.

Código de ejemplo para el mismo problema es el siguiente.

void main(){ string size = "16622"; string sizeFact = "20"; long long sizeLongLong = strtoll(size); int factInt = atoi(sizeFact); long double sizeLongDouble = (long double) sizeLongLong/pow(2, factInt); char buf[512]; sprintf(buf, "%.3lf %s", sizeLongDouble, "str"); }

Como se mencionó anteriormente, el código funciona bien en Windows de 32 bits y 64 bits, sin embargo, para Sprintf me da un núcleo en Solaris.

Traté de fundición tipo sprintf funcionó bien.

sprintf(buf, "%.3lf %s", (double) sizeLongDouble, "str");

¿Cuál es el especificador de formato para el long double ?

¿Cuál es el error que estoy cometiendo aquí? ¿Estoy utilizando un especificador de formato incorrecto debido a que está dando el núcleo?

¿Por qué necesito escribir cast una vez más en sprintf ()?


Agregaría esto como un comentario pero no puedo hacer eso todavía. También es importante tener en cuenta que también podría utilizar la notación ''p'' exponencial para el long double de esta manera:

  • Notación de punto fijo: %Lf
  • Notación exponencial: %Le
  • notación p: %La

Dependiendo del compilador, he visto %Lf y %llf probar ambos y ver cuál funciona. El %lf que usa es el especificador de formato para double no para long double . Creo que en g++ deberías usar %llf , mientras que en visual studio es %Lf .


Para el long double debes usar el formato "%Lf" . El formateo con una L pequeña (es decir, "%lf" ) no tiene efecto en los sistemas POSIX (consulte la especificación ).


La documentación lo deja bastante claro:

L

Una siguiente conversión a , A, e, E, f, F, g o G corresponde a un argumento doble largo. (C99> permite% LF, pero SUSv2 no).

Por lo tanto, debe utilizar %Lf .