C ++ strtod () - C ++ - vakiokirjasto

Strtod () -funktio C ++: ssa tulkitsee merkkijonon sisällön liukuluvuna ja palauttaa sen arvon kaksinkertaiseksi.

Tämä toiminto asettaa myös osoittimen osoittamaan merkkijonon viimeisen kelvollisen merkin jälkeistä ensimmäistä merkkiä, jos sellaista on, muuten osoitin asetetaan nollaksi.

Pohjalle 10 ja merkkijonolle "12abc"

Voimassa oleva numeerinen osa -> 12

Ensimmäinen merkki kelvollisen numeerisen osan jälkeen -> a

Se määritetään otsikkotiedostossa.

strtod () prototyyppi

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

Strtod () -funktio vie merkkijonon ja osoittimen merkkiin parametrina, tulkitsee merkkijonon sisällön floatlukuna ja palauttaa doublearvon.

strtod () -parametrit

  • str : Merkkijono, jolla on liukuluku.
  • end : Viittaus jo allokoituun objektiin, jonka tyyppi on char *. Loppuarvon määrittää funktio seuraavalle merkille merkkijonossa viimeisen kelvollisen merkin jälkeen. Tämä parametri voi olla myös nollaosoitin, jolloin sitä ei käytetä.

strtod () Palautusarvo

Strtod () -funktio palauttaa:

  • kaksinkertainen arvo (joka muunnetaan merkkijonosta).
  • 0,0, jos kelvollista muunnosta ei voitu suorittaa.

Jos muunnettu arvo on alueen ulkopuolella, tapahtuu aluevirhe ja positiivinen tai negatiivinen HUGE_VAL palautetaan.

Esimerkki 1: Kuinka strtod () -funktio toimii?

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

Kun suoritat ohjelmaa, tulos on:

 Luku loppumerkkijonossa = 12,44b 0xy Luku kaksinkertaisessa = 12,44 merkkijono = b 0xy

Esimerkki 2: strtod () -funktio ilman merkkejä

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

Kun suoritat ohjelmaa, tulos on:

 Numero loppumerkkijonossa = 12,44b 0xy-numero kaksinkertaisena = 12,44 Nollaosoitin

Strtod () -funktion kelvollinen liukuluku koostuu valinnaisesta + tai - -merkistä, jota seuraa jokin seuraavista sarjoista:

  • Desimaalinen liukulukuarvo :

    • Ryhmä desimaalilukuja (0-9), joka mahdollisesti sisältää desimaalipilkun (.).
      Esimerkiksi: 13.170, -5.63 jne.

    • Valinnainen eksponenttiosa (e tai E), jota seuraa valinnainen + tai - -merkki ja ei-tyhjä desimaalijärjestys.
      Esimerkiksi: 3.46101e + 007, 13.19e-013 jne.

  • Heksadesimaalinen liukuluku :

    • Merkkijono, joka alkaa 0x: lla tai 0X: llä, jota seuraa ei-tyhjä heksadesimaalilukujen sarja, joka sisältää mahdollisesti desimaalin (.).
      Esimerkiksi: 0xfa5, -0xb1f.24 jne.

    • Valinnainen eksponenttiosa (p tai P), jota seuraa valinnainen + tai - -merkki ja ei-tyhjä heksadesimaalilukujen sarja.
      Esimerkiksi: 0x51c.23p5, -0x2a.3p-3 jne.

  • Ääretön :

    • INF tai INFINITY (sivuutetaan kirjainkoko).
      Esimerkiksi: -Inf, InfiNiTy jne.

  • NaN (ei luku) :

    • NAN tai NANsequence (ohitetaan kirjainkoko), jossa sekvenssi on merkkijono, joka koostuu vain aakkosnumeerisista merkeistä tai alaviivasta (_). Tuloksena on hiljainen NaN.
      Esimerkiksi: Nan, NaNab1 jne.

Esimerkki 3: Kuinka strtod () toimii eksponenttien ja heksadesimaalien kanssa?

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

Kun suoritat ohjelmaa, tulos on:

 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 = hello

Example 4: strtod Cases for INFINITY and 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; ) 

When you run the program, the output will be:

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

In general, a valid floating point argument for strtod() function has the following form:

(whitespace) (- | +) (digits) (.digits) ( (e | E )(- | +)digits)

The strtod() function ignores all the leading whitespace characters until the primary non-whitespace character is found.

Tällöin tästä merkistä alkaen tarvitaan mahdollisimman monta merkkiä, jotka muodostavat kelvollisen liukuluvun ja muuntaa ne liukulukuarvoksi. Mikä merkkijonosta on jäljellä sen jälkeen, kun viimeinen kelvollinen merkki on tallennettu loppupään osoittamaan kohteeseen.

Esimerkki 5: strtod () -funktio, jossa on välilyönti

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

Kun suoritat ohjelmaa, tulos on:

 25,5 kaksinkertaiseksi = 25,5 loppumerkkijono = abc11,20 kaksinkertaiseksi = 0 päätejono = abc11,20

Mielenkiintoisia artikkeleita...