web-dev-qa-db-fra.com

Comment convertir une chaîne en float?

#include<stdio.h>
#include<string.h>

int main() 
{
    char s[100] ="4.0800" ; 

    printf("float value : %4.8f\n" ,(float) atoll(s)); 
    return 0; 
}

Je pense que la sortie devrait être 4.08000000 alors que je n'ai que 4.00000000.

Y a-t-il un moyen d'obtenir les chiffres après le point?

46
abubacker

Utilisez atof() ou strtof() * à la place:

printf("float value : %4.8f\n" ,atof(s)); 
printf("float value : %4.8f\n" ,strtof(s, NULL)); 

http://www.cplusplus.com/reference/clibrary/cstdlib/atof/
http://www.cplusplus.com/reference/cstdlib/strtof/

  • atoll() est destiné aux nombres entiers.
  • atof()/strtof() est pour les flottants.

La raison pour laquelle vous n'obtenez que 4.00 Avec atoll() est due au fait qu'il arrête l'analyse lorsque le premier non-chiffre est trouvé.

* Notez que strtof() requiert C99 ou C++ 11.

55
Mysticial

Malheureusement, il n’ya aucun moyen de le faire facilement. Chaque solution a ses inconvénients.

  1. Utilisez atof() ou strtof() directement: c'est ce que la plupart des gens vous diront de faire et cela fonctionnera la plupart du temps. Toutefois, si le programme définit un environnement local ou utilise une bibliothèque qui le définit (par exemple, une bibliothèque graphique qui affiche des menus localisés) et que l'environnement local de l'utilisateur est défini sur une langue où le séparateur décimal n'est pas . (comme fr_FR où le séparateur est ,), ces fonctions cesseront d’être analysées à la . et vous obtiendrez toujours 4.0.

  2. Utilisez atof() ou strtof() mais modifiez les paramètres régionaux; c'est une question d'appeler setlocale(LC_ALL|~LC_NUMERIC, ""); avant tout appel à atof() ou à l'inverse. Le problème avec setlocale est qu’il sera global dans le processus et que vous risquez d’interférer avec le reste du programme. Notez que vous pouvez interroger les paramètres régionaux en cours avec setlocale() et les restaurer après avoir terminé.

  3. Ecrivez votre propre routine d'analyse de float. Cela peut être assez rapide si vous n’avez pas besoin de fonctionnalités avancées telles que l’analyse des exposants ou les flottants hexadécimaux.

En outre, notez que la valeur 4.08 Ne peut pas être représentée exactement comme un float; la valeur réelle que vous obtiendrez est 4.0799999237060546875.

28
sam hocevar

Pourquoi ne devrait-on pas utiliser function atof () pour convertir une chaîne en double?

En cas de succès, la fonction atof () renvoie le nombre à virgule flottante converti sous forme de valeur double. Si aucune conversion valide ne peut être effectuée, la fonction renvoie zéro (0.0). Si la valeur convertie est en dehors de la plage de valeurs représentables par un double, cela provoque comportement indéfini.

Référence: http://www.cplusplus.com/reference/cstdlib/atof/

Utilisez plutôt la fonction strtod () , elle est plus robuste.

Essayez ce code:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    char s[100] = "4.0800";
    printf("Float value : %4.8f\n",strtod(s,NULL));
    return 0;
}

Vous obtiendrez le résultat suivant:

Float value : 4.08000000

17
user1336087

Utilisez atof()

Mais ceci est déconseillé, utilisez plutôt ceci:

const char* flt = "4.0800";
float f;
sscanf(flt, "%f", &f);

http://www.cplusplus.com/reference/clibrary/cstdlib/atof/

atof() renvoie 0 à la fois en cas d'échec et lors de la conversion de 0.0, il est préférable de ne pas l'utiliser.

4
Luchian Grigore

En utilisant sscanf, nous pouvons convertir une chaîne en float.

#include<stdio.h>    
#include<string.h>    

int main() 
{
    char str[100] ="4.0800" ;     
    const char s[2] = "-";   
    char *token;
    double x;
   /* get the first token */ 
   token = strtok(str, s);
   sscanf(token,"%f",&x);
    printf( " %f",x );

    return 0; 
}
1
Kavita Jain

Vous voulez utiliser la fonction atof ().

http://www.cplusplus.com/reference/clibrary/cstdlib/atof/

0
mwp