2016-05-19 2 views
0

J'ai besoin de convertir une chaîne en un flotteur. Si la chaîne n'est pas un numéro que je veux retourner 0.Pourquoi la fonction atof() ne renvoie pas 0 lorsque je lui passe une chaîne avec des caractères non valides après un nombre?

J'ai essayé de tester si la fonction atof() fonctionnerait pour cela en utilisant le code suivant:

printf("%f", atof("1a")); 

De ma compréhension de atof, la valeur renvoyée lorsque atof ne peut pas convertir est 0, et pourtant cette ligne affiche 1.0.

Pourquoi cela se produit-il? Par la documentation j'ai compris que atof est censé retourner 0 quand l'entrée n'est pas un nombre.

+0

vous pourriez être mieux d'utiliser: 'strtod()'. Notez que 'atof()' renvoie un 'double', pas un' float'. Note: la fonction: 'atof()' verra le '1' comme un nombre valide et retournera le résultat de la conversion: 1.000000. Il n'y a aucune raison de renvoyer 0,000000 car il y a un nombre valide à convertir. – user3629249

Répondre

3

De doc. Non souligné dans

La fonction première défausse autant de caractères blancs (comme dans isspace) que nécessaire jusqu'à ce que le premier caractère non-blanc est trouvé. Puis, à partir de ce caractère, prend autant de caractères que possible qui sont valides suivant une syntaxe ressemblant à celle de littéraux en virgule flottante (voir ci-dessous), et les interprète comme une valeur numérique . Le reste de la chaîne après le dernier caractère valide est ignoré et n'a aucun effet sur le comportement de cette fonction.

1

j'ai vu que vous avez vérifié certains documents, mais vous devez avoir raté la partie souligné - il est important de vous assurer que vous lisez la documentation bien: http://www.cplusplus.com/reference/cstdlib/atof/

La fonction première défausse autant de caractères blancs (comme dans isspace) comme nécessaire jusqu'à ce que le premier caractère non-espace soit trouvé. Puis, à partir de ce caractère, prend autant de caractères que possible qui sont valides suivant une syntaxe ressemblant à celle des littéraux en virgule flottante (voir ci-dessous), et les interprète comme une valeur numérique. Le reste de la chaîne après le dernier caractère valide est ignoré et n'a aucun effet sur le comportement de cette fonction.

Ainsi, la fonction se comporte exactement comme il se doit - le caractère a dans "1a" est ignorée.

1

encore cette ligne imprime 1.0.

printf("%f", atof("1a")); 

a fonctionné parce que atof pourrait analyser atleast un nombre 1-à-dire dans ce cas.

Mais:

char a[]="a1"; 
printf("%f\n",atof(a)); 

si vous avez donné une valeur de retour de 0,0 comme prévu.