Как преобразовать значение float
в char*
в C
языке?Преобразование float в char *
ответ
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.
Используйте snprintf вместо этого, чтобы обеспечить отсутствие переполнения буфера. – JeremyP
Отличная идея! Я добавлю это к своему ответу ... –
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);
+1, хотя это должен указать, что это расширение GNU afaik.(asprintf - это GNU ext, я имею в виду) – ShinTakezou
char array[10];
snprintf(array, sizeof(array), "%f", 3.333333);
в 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);
Давно после принятия ответа.
Используйте 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()
.
typedef union{
float a;
char b[4];
} my_union_t;
Вы можете получить доступ к байту данных с поплавковым байтом и отправить его через 8-разрядный выходной буфер (например, USART) без кастинга.
Обновление: не забывайте о контенте процессора! – Peter
- 1. C++ Преобразование float в unsigned char?
- 2. Преобразование float в char [] без выделения памяти
- 3. Преобразование char в вектор <float>
- 4. Преобразование из массива float в char
- 5. Преобразование char * для float или double
- 6. Преобразование строки в float
- 7. Преобразование QVariant в float
- 8. Преобразование float в строку
- 9. Преобразование из float в unsigned char в C
- 10. Преобразование из float в char [] в Java (Android)
- 11. Преобразование float в float опция
- 12. ошибка: несовместимые типы возможны потерять преобразование из float в char
- 13. opencv C++: преобразование матрицы изображений из unsigned char в float
- 14. Преобразование float в символы для float (PYTHON)
- 15. char * to float *
- 16. Преобразование Haskell [Char] в Char
- 17. Преобразование Char * в массив Char *
- 18. Преобразование символа char * в char
- 19. C Преобразование char в char *
- 20. Преобразование из void * в float
- 21. Parsing Float from char
- 22. Как преобразовать Char в Float
- 23. преобразование char ** в char * или char
- 24. Преобразование char-date-char
- 25. Haskell int float и char to float
- 26. Преобразование двоичных данных в float
- 27. Преобразование из строки в float
- 28. Преобразование символьного массива в float?
- 29. Преобразование строки символов в float
- 30. Преобразование CharSequence в Float
Вам нужно быть более конкретным. Что вам нужно - текстовое представление десятичного значения поплавка? Поток байтов, который вы можете легко пропустить и использовать для воссоздания поплавка позже? – crazyscot