5

Tengo una pregunta sobre el uso de printf.formato de cadena para printf valores de coma flotante

char str[8]; 
float val = 2.334563; 
sprintf(str, format, val); 
printf("val = %s.\n", str); 

val = -23.34563; 
sprintf(str, format, val); 
printf("val = %s.\n", str); 

val = -0.02334563; 
sprintf(str, format, val); 
printf("val = %s.\n", str); 

val = 233; 
sprintf(str, format, val); 
printf("val = %s.\n", str); 

La salida esperada sigue:

val = +2.3345 
val = -23.345 
val = -0.0233 
val = +233.00 

Qué cadena de formato necesito para eso? Gracias por su atención.

Respuesta

3

lo que pasó con el viejo %f

+0

no consigue salida deseada. Su pregunta debería ser más directa. –

+0

@JoeMcGrath: Esta Q claramente huele a Tarea y no aprecio escribir ningún tipo de código para las Preguntas de Tareas aparte de dar consejos o ideas. ** Motivo: ** No quiero que un programador se siente a mi lado (aunque dentro de unos años) que no puede escribir un código fuente dado una pista. –

+0

Bien, gracias. Soy nuevo en Stack Overflow y no me di cuenta. Solo trato de responder preguntas. Soy un programador aficionado que no ha asistido a la escuela. No pensé en las asignaciones de tareas. Recordará hacer esto en el futuro. –

0
"%f" 

ejemplo

printf("%f\n", floatVal); 
+0

Necesito cadena de salida de tamaño fijo. – user1020803

+0

ni ''% f "' mostrará el signo + delante de números positivos. –

+0

"% + f" mostrará el signo ... Pero este no es todo el problema ... – user1020803

1

uso snprintf() para truncar cadena en exactamente 8 caracteres incluyendo \0

formato de cadena:

"%#+.5f" 

% modifier 
# force decimal place 
+ show + or - 
.5 precision of 5 
f use precision as places after decimal 

Código:

char str[8]; 
float val = 2.334563; 
snprintf(str,8, "%#+.5f", val); 
printf("val = %s\n", str); 

val = -23.34563; 
snprintf(str,8, "%#+.5f", val); 
printf("val = %s\n", str); 

val = -0.02334563; 
snprintf(str,8, "%#+.5f", val); 
printf("val = %s\n", str); 

val = 233.001; 
snprintf(str,8, "%#+.5f", val); 
printf("val = %s\n", str); 

Salida:

val = +2.3345 
val = -23.345 
val = -0.0233 
val = +233.00 
val = +0.0003 
+0

Creo snprintf (str, 8, "% # + .5f", 0.0003); lo mejor de todo – user1020803

+0

@ user1020803 Eso funciona en todos los casos. Me perdí en todos mis cambios, no estoy seguro de por qué todavía estaba usando sig higos después de cambiar a snprintf(). Gracias. editado para reflejar –

0

La única cosa que puedo llegar a es el siguiente:

const char *format = "val = %+6.*f\n"; 
int places_past_decimal = ???; 
printf(format, places_past_decimal, 2.334563f); 

En este caso, tendrá que pasar un argumento adicional (places_past_decimal) que es el número de dígitos restantes en el número que no son utilizados por el lado izquierdo del número .

+0

Lo pensé, pero esperaba la mejor solución. – user1020803

1

Lo siguiente (casi) hace lo que quiere. Tenga en cuenta que modifiqué el número de caracteres en la matriz str de 7 a 8; dado que todas sus cadenas de salida contienen 7 caracteres, la terminación NULA realizada por sprintf causará desbordamiento de búfer en caso contrario.

La única diferencia entre mis resultados y los suyos es el redondeo realizado por sprintf. AFAIK, la única forma de evitar esto es pretruncar el número que desea imprimir usando floor; por ejemplo, para imprimir 2 dígitos sin redondeo float f = floor(1.8888 * 100)/100;

#include <stdio.h> 

int main(void) 
{ 
    char str[8]; 

    { 
    float val = 2.334563f; 
    sprintf(str, "%+6.*f", 4, val); 
    printf("val = %s.\n", str); 
    } 

    { 
    float val = -23.34563f; 
    sprintf(str, "%+6.*f", 3, val); 
    printf("val = %s.\n", str); 
    } 

    { 
    float val = -0.02334563f; 
    sprintf(str, "%+6.*f", 4, val); 
    printf("val = %s.\n", str); 
    } 

    { 
    float val = 233.0f; 
    sprintf(str, "%+6.*f", 2, val); 
    printf("val = %s.\n", str); 
    } 

    return 0; 
} 

Salida:

val = +2.3346. 
val = -23.346. 
val = -0.0233. 
val = +233.00. 
+0

Sí, me olvidé de NULL – user1020803

+0

Esto requiere calcular manualmente el número necesario de decimales en el código. ¿Cuál es la manera de hacer esto con el código para cualquier caso? –

Cuestiones relacionadas