Convertir flotante a char*
-
24-10-2019 - |
Pregunta
¿Cómo puedo convertir un float
valor a char*
en C
¿idioma?
Solución
char buffer[64];
int ret = snprintf(buffer, sizeof buffer, "%f", myFloat);
if (ret < 0) {
return EXIT_FAILURE;
}
if (ret >= sizeof buffer) {
/* Result was truncated - resize the buffer and retry.
}
Que almacenará la representación de cadena de myFloat
en myCharPointer
. Sin embargo, asegúrese de que la cuerda sea lo suficientemente grande como para sostenerla.
snprintf
es una mejor opción que sprintf
Como garantiza, nunca escribirá más allá del tamaño del búfer que suministra en el argumento 2.
Otros consejos
char array[10];
sprintf(array, "%f", 3.123);
sprintf: (de MSDN)
En Arduino:
//temporarily holds data from vals
char charVal[10];
//4 is mininum width, 3 is precision; float value is copied onto buff
dtostrf(123.234, 4, 3, charVal);
monitor.print("charVal: ");
monitor.println(charVal);
Mucho después de aceptar la respuesta.
Usar sprintf()
, o funciones relacionadas, como muchos otros tienen respuestas sugeridas, pero use un mejor especificador de formato.
Usando "%.*e"
, el código resuelve varios problemas:
El tamaño máximo de búfer que se necesita es mucho más razonable, como 18.
sprintf(buf, "%f", FLT_MAX);
podría necesitar 47+.sprintf(buf, "%f", DBL_MAX);
puede necesitar 317+Usando
".*"
permite que el código defina el número de decimales necesarios para distinguir una versión de cadena defloat x
Y es el siguiente más altofloat
. Para los desatados, ver Printf Ancho Especificador para mantener la precisión del valor de punto flotanteUsando
"%e"
permite que el código distinga pequeñofloat
s del uno al otro en lugar de toda impresión"0.000000"
¿Cuál es el resultado cuando|x| < 0.0000005
.#define FLT_STRING_SIZE (1+1+1+(FLT_DECIMAL_DIG-1)+1+1+ 4 +1) // - d . dddddddd e - dddd \0 char buf[FLT_STRING_SIZE]; sprintf(buf, "%.*e", FLT_DECIMAL_DIG-1, some_float);
Ideas:
OMI, es mejor usar un tamaño de búfer de 2x para almohadillas para rascar como buf[FLT_STRING_SIZE*2]
.
Para mayor robustez, use snprintf()
.
char* str=NULL;
int len = asprintf(&str, "%g", float_var);
if (len == -1)
fprintf(stderr, "Error converting float: %m\n");
else
printf("float is %s\n", str);
free(str);
typedef union{
float a;
char b[4];
} my_union_t;
Puede acceder al valor de datos de flotación byte by byte y enviarlo a través de un búfer de salida de 8 bits (por ejemplo, USART) sin fundición.
char array[10];
snprintf(array, sizeof(array), "%f", 3.333333);