Преобразование типа float в char*

как я могу преобразовать float значение char* на C язык?

7 ответов


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.
}

это сохранит строковое представление myFloat на myCharPointer. Однако убедитесь, что строка достаточно велика, чтобы удерживать ее.

snprintf является лучшим вариантом, чем sprintf поскольку это гарантирует, что он никогда не будет писать за размер буфера, который вы предоставляете в аргументе 2.


char array[10];
sprintf(array, "%f", 3.123);

sprintf: (из MSDN)


В 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);

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;

вы можете получить доступ к значению данных float байт за байтом и отправить его через 8-битный выходной буфер (например, USART) без кастинга.


долго после принятия ответа.

использовать sprintf() или связанные функции, как и многие другие, предлагают ответы, но используют лучший спецификатор формата.

используя "%.*e", код решает различные вопросы:

  • максимальный размер буфера необходим гораздо разумнее, как 18. sprintf(buf, "%f", FLT_MAX); может понадобиться 47+. sprintf(buf, "%f", DBL_MAX); может понадобиться 317+

  • используя ".*" позволяет коду определить количество десятичных знаков, необходимых для различать строковую версию float x и далее высокие float. Для деталей, см. спецификатор ширины Printf для поддержания точности значения с плавающей запятой

  • используя "%e" позволяет коду различать малые floats друг от друга, а не все печати "0.000000" что является результатом, когда |x| < 0.0000005.

    #define FLT_STRING_SIZE (1+1+1+(FLT_DECIMAL_DIG-1)+1+1+ 4   +1)
                         //  - d .  dddddddd           e - dddd 
    
    char buf[FLT_STRING_SIZE];
    sprintf(buf, "%.*e", FLT_DECIMAL_DIG-1, some_float);
    

мысли:
IMO, лучше использовать размер буфера 2x для царапин, таких как buf[FLT_STRING_SIZE*2].
Для дополнительной надежности используйте snprintf().


char array[10];
snprintf(array, sizeof(array), "%f", 3.333333);