Question

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

Était-ce utile?

La solution

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

qui stockera la représentation de chaîne de myFloat dans myCharPointer. Assurez-vous que la chaîne est assez grand pour contenir, cependant.

snprintf est une meilleure option que sprintf car elle garantit qu'il ne sera jamais écrire passé la taille de la mémoire tampon que vous fournissez en argument 2.

Autres conseils

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

sprintf : (à partir de MSDN)

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

Long accepter après la réponse.

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

Utilisation "%.*e", permet de résoudre divers problèmes de code:

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

  • Utilisation ".*" permet au code de définir le nombre de décimales nécessaires pour distinguer une version de chaîne de float x et le plus élevé suivant float. Pour deatils, voir spécificateur Printf largeur pour maintenir la précision de flotter -point valeur

  • Utilisation "%e" permet au code de distinguer les petits floats les uns des autres plutôt que tous "0.000000" d'impression 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:
OMI, mieux utiliser 2x taille tampon pour les plaquettes à gratter comme buf[FLT_STRING_SIZE*2].
Pour plus de robustesse, l'utilisation 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;

Vous pouvez accéder à flotter octet de valeur de données par octet et l'envoyer à travers un tampon de sortie à 8 bits (par exemple USART) sans moulage.

char array[10];
snprintf(array, sizeof(array), "%f", 3.333333);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top