web-dev-qa-db-ja.com

floatからchar *への変換

float値をC言語のchar*に変換するにはどうすればよいですか?

14
boom
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で指定したバッファーのサイズを超えて書き込みを行わないことを保証するためです。

29
Delan Azabani
char array[10];
sprintf(array, "%f", 3.123);

sprintf :(MSDNから)

8
aJ.

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);
5
baligena

回答を受け入れてからずっと。

他の多くの回答が提案しているように、sprintf()、または関連する関数を使用してください。

_"%.*e"_を使用すると、コードはさまざまな問題を解決します。

  • 必要な最大バッファサイズは18のようにはるかに合理的です。sprintf(buf, "%f", FLT_MAX);は47+を必要とします。 sprintf(buf, "%f", DBL_MAX);には317+が必要な場合があります

  • _".*"_を使用すると、コードは_float x_の文字列バージョンと次に高いfloatを区別するために必要な小数点以下の桁数を定義できます。詳細については、 浮動小数点値の精度を維持するためのPrintf幅指定子 を参照してください。

  • _"%e"_を使用すると、コードが、_"0.000000"_の結果である_|x| < 0.0000005_をすべて印刷するのではなく、小さなfloatsを互いに区別できます。

    _#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、_buf[FLT_STRING_SIZE*2]_のようなスクラッチパッドに2倍のバッファサイズを使用することをお勧めします。
堅牢性を高めるには、snprintf()を使用します。

3
chux
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);
2
pixelbeat
typedef union{
    float a;
    char b[4];
} my_union_t;

バイト単位でfloatデータ値にアクセスし、キャストせずに8ビット出力バッファー(USARTなど)経由で送信できます。

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