Преобразование плавания в Char*
-
24-10-2019 - |
Вопрос
Как я могу преобразовать 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"
Позволяет коду различать маленькие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);
Идеи:
ИМО, лучше использовать 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);