Pregunta

¿Cómo puedo convertir un float valor a char* en C ¿idioma?

¿Fue útil?

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 de float x Y es el siguiente más alto float. Para los desatados, ver Printf Ancho Especificador para mantener la precisión del valor de punto flotante

  • Usando "%e" permite que el código distinga pequeño floats 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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top