web-dev-qa-db-fra.com

Conversion de float en char *

Comment puis-je convertir une valeur float en char* en C langue?

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.
}

Cela stockera la représentation sous forme de chaîne de myFloat dans myCharPointer. Assurez-vous cependant que la chaîne est suffisamment grande pour la contenir.

snprintf est une meilleure option que sprintf car il garantit qu'il n'écrira jamais au-delà de la taille du tampon que vous fournissez dans l'argument 2.

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

sprintf : (à partir de MSDN)

8
aJ.

En 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

Longtemps après accepter la réponse.

Utilisez sprintf(), ou des fonctions connexes, comme beaucoup d'autres ont suggéré des réponses, mais utilisez un meilleur spécificateur de format.

En utilisant "%.*e", Le code résout divers problèmes:

  • La taille maximale du tampon nécessaire est beaucoup plus raisonnable, comme 18. sprintf(buf, "%f", FLT_MAX); pourrait avoir besoin de 47+. sprintf(buf, "%f", DBL_MAX); peut avoir besoin de 317+

  • L'utilisation de ".*" Permet au code de définir le nombre de décimales nécessaires pour distinguer une version chaîne de float x Et la plus haute float. Pour les détails, voir spécificateur de largeur Printf pour maintenir la précision de la valeur à virgule flottante

  • L'utilisation de "%e" Permet au code de distinguer les petits float les uns des autres plutôt que toutes les impressions "0.000000" Qui est le résultat lorsque |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);
    

Idées:
IMO, il vaut mieux utiliser une taille de tampon 2x pour les blocs-notes comme buf[FLT_STRING_SIZE*2].
Pour plus de robustesse, utilisez 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;

Vous pouvez accéder à la valeur flottante des données octet par octet et l'envoyer via un tampon de sortie 8 bits (par exemple USART) sans transtypage.

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