Ambiguïté strtod (): erreur de format et conversion zéro

J’envisage d’utiliser la fonction strtod () pour convertir une chaîne en double en C, dont la siganture est la suivante:

double strtod (const char* str, char** endptr); 

Étant str la chaîne à convertir et endptr un pointeur à définir sur le premier caractère après le nombre.

La documentation dit:

En cas de succès, la fonction renvoie le nombre converti en virgule flottante sous la forme d’une valeur de type double. Si aucune conversion valide ne peut être effectuée, la fonction renvoie zéro (0.0).

Ainsi, pour autant que je sache, il n’est pas possible de détecter les situations dans lesquelles str présente une erreur de format (par exemple, “foo”, “-3ab” ou “3o3”) dans les situations dans lesquelles str représente 0 (par exemple, “0” , “0.000”, “-0.0”, “0e10”).

Comment la fonction strtod () pourrait-elle être utilisée pour éviter ce problème en conversion zéro?

EDIT : J’ai vu une question similaire ici . Cependant, je pense que je ne demande pas la même chose, car ma question concerne le problème d’ambiguïté entre 0 et une chaîne mal formulée, alors que cette autre publication traite de la détection des erreurs de format en général.

En outre, si vous souhaitez détecter d’autres erreurs, telles que “3.14xyz”, strtod renverra 3.14, mais endptr pointera vers le “x”. Ainsi, si, après strtod, “endptr” ne pointe pas vers “str” ​​ET “endptr ‘pointe uniquement sur les espaces (ou EXACTEMENT 0 si vous voulez être ssortingct), alors’ str ‘est en effet un float valide. De plus, errno contient le code d’erreur ERANGE si la chaîne ‘str’ provoque un débordement.

En voici une implémentation:

 bool isDouble(const char* s) { char* rest = (char*) s; strtod(s, &rest); if ((rest == s) || (errno == ERANGE)) return false; // If all WS after the last char used in the conversion, then the ssortingng is considered a 'clean float' while ((*rest == ' ') || (*rest == '\t') || (*rest == '\n')) ++rest; return (*rest == 0); } 

C’est précisément pourquoi vous avez endptr . Si après l’appel endptr == str , aucun numéro n’a été analysé.