2010-06-07 4 views
11

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

+6

Вам нужно быть более конкретным. Что вам нужно - текстовое представление десятичного значения поплавка? Поток байтов, который вы можете легко пропустить и использовать для воссоздания поплавка позже? – crazyscot

ответ

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

+5

Используйте snprintf вместо этого, чтобы обеспечить отсутствие переполнения буфера. – JeremyP

+0

Отличная идея! Я добавлю это к своему ответу ... –

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

sprintf: (из MSDN)

+0

@aJ Когда значение напечатано в буфере, на консоли будет также напечатан тот же оператор печати. ​​ – boom

+0

sprintf напишет значение float в буфере. Если вы хотите напечатать то же самое с консолью, используйте printf («% f» ... –

2
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); 
+0

+1, хотя это должен указать, что это расширение GNU afaik.(asprintf - это GNU ext, я имею в виду) – ShinTakezou

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

в 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); 
1

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

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

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

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

  • Использования ".*" позволяет коду для определения количества десятичных разрядов, необходимых для различения строковой версии float x и ее следующей наивысочайшего float. Для deatils см Printf width specifier to maintain precision of floating-point value

  • Использование "%e" позволяет коду различать мелкие float S друг от друга, а не всей печати "0.000000" которая является результатом, когда |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); 
    

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

2
typedef union{ 
    float a; 
    char b[4]; 
} my_union_t; 

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

+0

Обновление: не забывайте о контенте процессора! – Peter

Смежные вопросы