Вопрос

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

Это было полезно?

Решение

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)

В Ардуино:

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

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

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

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

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

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

  • С использованием "%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 \0
    
    char buf[FLT_STRING_SIZE];
    sprintf(buf, "%.*e", FLT_DECIMAL_DIG-1, some_float);
    

Идеи:
ИМО, лучше использовать 2 -кратный размер буфера для подушек для царапин buf[FLT_STRING_SIZE*2].
Для дополнительной надежности, используйте 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;

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

char array[10];
snprintf(array, sizeof(array), "%f", 3.333333);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top