C ++ strtod () - Bibliothèque standard C ++

La fonction strtod () en C ++ interprète le contenu d'une chaîne comme un nombre à virgule flottante et renvoie sa valeur comme un double.

Cette fonction définit également un pointeur pour qu'il pointe sur le premier caractère après le dernier caractère valide de la chaîne s'il y en a, sinon le pointeur est défini sur null.

Pour la base 10 et la chaîne "12abc"

Partie numérique valide -> 12

Premier caractère après une partie numérique valide -> a

Il est défini dans le fichier d'en-tête.

prototype de strtod ()

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

La fonction strtod () prend une chaîne et un pointeur vers un caractère comme paramètre, interprète le contenu de la chaîne comme un floatnombre et renvoie une doublevaleur.

Paramètres de strtod ()

  • str : Une chaîne ayant la représentation d'un nombre à virgule flottante.
  • end : Référence à un objet déjà alloué de type char *. La valeur de fin est définie par la fonction sur le caractère suivant dans str après le dernier caractère valide. Ce paramètre peut également être un pointeur nul, auquel cas il n'est pas utilisé.

strtod () Valeur de retour

La fonction strtod () renvoie:

  • une valeur double (qui est convertie à partir de la chaîne).
  • 0.0 si aucune conversion valide n'a pu être effectuée.

Si la valeur convertie est hors de la plage, une erreur de plage se produit et un HUGE_VAL positif ou négatif est renvoyé.

Exemple 1: Comment fonctionne la fonction strtod ()?

 #include #include using namespace std; int main() ( char numberString() = "12.44b 0xy"; char *end; double number; number = strtod(numberString,&end); cout << "Number in String = " << numberString << endl; cout << "Number in Double = " << number << endl; cout << "End String = " << end << endl; return 0; ) 

Lorsque vous exécutez le programme, la sortie sera:

 Number in End String = 12.44b 0xy Number in Double = 12.44 String = b 0xy

Exemple 2: fonction strtod () sans caractères de fin

 #include #include using namespace std; int main() ( char numberString() = "12.44"; char *end; double number; number = strtod(numberString,&end); cout << "Number in String = " << numberString << endl; cout << "Number in Double = " << number << endl; // If end is not Null if (*end) ( cout << end; ) // If end is Null else ( cout << "Null pointer"; ) return 0; ) 

Lorsque vous exécutez le programme, la sortie sera:

 Number in End String = 12.44b 0xy Number in Double = 12.44 Pointeur nul

Une valeur à virgule flottante valide pour la fonction strtod () se compose d'un signe + ou - optionnel suivi de l'un des ensembles suivants:

  • Pour une valeur décimale à virgule flottante :

    • Un groupe de chiffres décimaux (0-9), contenant éventuellement un point décimal (.).
      Par exemple: 13.170, -5.63, etc.

    • Une partie d'exposant facultative (e ou E) suivie d'un signe + ou - facultatif et d'une séquence non vide de chiffres décimaux.
      Par exemple: 3.46101e + 007, 13.19e-013, etc.

  • Pour une valeur à virgule flottante hexadécimale :

    • Une chaîne commençant par 0x ou 0X, suivie d'une séquence non vide de chiffres hexadécimaux, contenant éventuellement un point décimal (.).
      Par exemple: 0xfa5, -0xb1f.24, etc.

    • Une partie d'exposant facultative (p ou P) suivie d'un signe + ou - facultatif et d'une séquence non vide de chiffres hexadécimaux.
      Par exemple: 0x51c.23p5, -0x2a.3p-3, etc.

  • Infini :

    • INF ou INFINITY (sans tenir compte de la casse).
      Par exemple: -Inf, InfiNiTy, etc.

  • NaN (pas un nombre) :

    • NAN ou NANséquence (sans tenir compte de la casse) où la séquence est une séquence de caractères composée uniquement de caractères alphanumériques ou du trait de soulignement (_). Le résultat est un NaN silencieux.
      Par exemple: Nan, NaNab1, etc.

Exemple 3: Comment strtod () fonctionne-t-il avec les exposants et les hexadécimaux?

 #include #include #include using namespace std; int main() ( // initialize a exponential value char numberString() = "-44.01e-3End String"; char *end; double number; number = strtod(numberString,&end); cout << "Number in String = " << numberString << endl; cout << "Number in Double = " << number << endl; cout << "End String = " << end << endl << endl; // initialize a new hexadecimal value strcpy(numberString,"0xf1bc.51hello"); number = strtod(numberString,&end); cout << "Number in String = " << numberString << endl; cout << "Number in Double = " << number << endl; cout << "End String = " << end << endl; return 0; ) 

Lorsque vous exécutez le programme, la sortie sera:

 Number in String = -44.01e-3End String Number in Double = -0.04401 End String = End String Number in String = 0xf1bc.51hello Number in Double = 61884.3 End String = bonjour

Exemple 4: cas strtod pour INFINITY et NaN

 #include #include using namespace std; int main() ( char *end; cout << "INFINITY" << " to Double = " << strtod("INFINITY", &end) << endl; cout << "End String = " << end << endl << endl; cout << "Infabc" << " to Double = " << strtod("Infabc", &end) << endl; cout << "End String = " << end << endl << endl; cout << "NaN12a" << " to Double = " << strtod("NaN12a", &end) << endl; cout << "End String = " << end << endl << endl; return 0; ) 

Lorsque vous exécutez le programme, la sortie sera:

 INFINITY to Double = inf End String = Infabc to Double = inf End String = abc NaN12a to Double = nan End String = 12a

En général, un argument en virgule flottante valide pour la fonction strtod () a la forme suivante:

(espace) (- | +) (chiffres) (.digits) ((e | E) (- | +) chiffres)

La fonction strtod () ignore tous les caractères d'espacement de tête jusqu'à ce que le caractère non blanc principal soit trouvé.

Ensuite, à partir de ce caractère, il prend autant de caractères que possible pour former une représentation à virgule flottante valide et les convertit en une valeur à virgule flottante. Tout ce qui reste de la chaîne après le dernier caractère valide est stocké dans l'objet pointé par end.

Exemple 5: fonction strtod () avec un espace au début

 #include #include using namespace std; int main() ( char *end; cout << "25.5" << " to Double = " << strtod(" 25.5", &end) << endl; // end pointer is set to null cout << "End String = " << end << endl << endl; // Returns 0 because of invalid conversion cout << "abc11.20" << " to Double = " << strtod("abc11.20", &end) << endl; cout << "End String = " << end << endl << endl; return 0; ) 

Lorsque vous exécutez le programme, la sortie sera:

 25,5 à Double = 25,5 Chaîne de fin = abc11.20 à Double = 0 Chaîne de fin = abc11.20

Articles intéressants...