Преобразование поплавка в символ * - PullRequest
14 голосов
/ 07 июня 2010

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

Ответы [ 7 ]

30 голосов
/ 07 июня 2010
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.

8 голосов
/ 07 июня 2010
char array[10];
sprintf(array, "%f", 3.123);

sprintf : (из MSDN)

5 голосов
/ 03 февраля 2015

В 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);
2 голосов
/ 12 февраля 2015
typedef union{
    float a;
    char b[4];
} my_union_t;

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

2 голосов
/ 03 февраля 2015

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

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

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

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

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

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

2 голосов
/ 07 июня 2010
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 голосов
/ 07 июня 2010
char array[10];
snprintf(array, sizeof(array), "%f", 3.333333);
...