Funkcija strtod () u C ++-u interpretira sadržaj niza kao broj s pomičnom zarezom i vraća njegovu vrijednost kao dvostruku.
Ova funkcija također postavlja pokazivač koji pokazuje na prvi znak nakon zadnjeg važećeg znaka niza ako postoji, u suprotnom je pokazivač postavljen na nulu.
Za bazu 10 i niz "12abc"
Važeći numerički dio -> 12
Prvi znak nakon valjanog numeričkog dijela -> a
Definirano je u datoteci zaglavlja.
prototip strtod ()
dvostruki strtod (const char * str, char ** kraj);
Funkcija strtod () uzima parametar string i pokazivač na znak, interpretira sadržaj niza kao float
broj i vraća double
vrijednost.
strtod () Parametri
- str : Niz koji ima broj s pokretnom zarezom.
- kraj : referenca na već dodijeljeni objekt tipa char *. Vrijednost end funkcija postavlja na sljedeći znak u str nakon zadnjeg važećeg znaka. Ovaj parametar također može biti null pokazivač, u kojem se slučaju ne koristi.
strtod () Povratna vrijednost
Funkcija strtod () vraća:
- dvostruka vrijednost (koja se pretvara iz niza).
- 0.0 ako se nije mogla izvršiti valjana pretvorba.
Ako je pretvorena vrijednost izvan raspona, pojavljuje se pogreška raspona i vraća se pozitivan ili negativan HUGE_VAL.
Primjer 1: Kako funkcionira funkcija 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; )
Kada pokrenete program, izlaz će biti:
Broj u završnom nizu = 12,44b 0xy Broj u dvostrukom = 12,44 niza = b 0xy
Primjer 2: funkcija strtod () bez pratećih znakova
#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; )
Kada pokrenete program, izlaz će biti:
Broj u završnom nizu = 12.44b 0xy Broj u dvostrukom = 12.44 Nulti pokazivač
Važeća vrijednost s pomičnom zarezom za funkciju strtod () sastoji se od izbornog znaka + ili - iza kojeg slijedi jedan od sljedećih skupova:
-
Za decimalnu vrijednost s pomičnim zarezom :
-
Skupina decimalnih znamenki (0-9), koja po izboru sadrži decimalnu točku (.).
Na primjer: 13.170, -5,63 itd. -
Izborni eksponentni dio (e ili E) nakon kojeg slijedi neobavezni znak + ili - i neprazan slijed decimalnih znamenki.
Na primjer: 3,46101e + 007, 13,19e-013 itd.
-
-
Za heksadecimalnu vrijednost s pomičnim zarezom :
-
Niz koji započinje s 0x ili 0X, nakon čega slijedi neprazan niz heksadecimalnih znamenki, koji po izboru sadrži decimalnu točku (.).
Na primjer: 0xfa5, -0xb1f.24 itd. -
Izborni eksponentni dio (p ili P) nakon kojeg slijedi neobavezni znak + ili - i neprazan niz heksadecimalnih znamenki.
Na primjer: 0x51c.23p5, -0x2a.3p-3 itd.
-
-
Beskonačnost :
-
INF ili INFINITY (zanemarujući slučaj).
Na primjer: -Inf, InfiNiTy itd.
-
-
NaN (nije broj) :
-
NAN ili NANsljed (ignoriranje slučaja) gdje je slijed slijed znakova koji se sastoji samo od alfanumeričkih znakova ili donje crte (_). Rezultat je tihi NaN.
Na primjer: Nan, NaNab1 itd.
-
Primjer 3: Kako strtod () radi s eksponentima i heksadecimalima?
#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; )
Kada pokrenete program, izlaz će biti:
Broj u nizu = -44.01e-3Završni broj niza u dvostrukom = -0.04401 Krajnji niz = Krajnji niz u nizu = 0xf1bc.51pozdravni broj u dvostrukom = 61884.3 Završni niz = pozdrav
Primjer 4: strtod Slučajevi za INFINITY i 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; )
Kada pokrenete program, izlaz će biti:
INFINITY na Double = inf Krajnji niz = Infabc na Double = inf Krajnji niz = abc NaN12a na Double = nan End String = 12a
Općenito, valjani argument s pomičnim zarezom za funkciju strtod () ima sljedeći oblik:
(razmak) (- | +) (znamenke) (. znamenke) ((e | E) (- | +) znamenke)
Funkcija strtod () zanemaruje sve vodeće razmake dok se ne pronađe primarni znak koji nije razmak.
Zatim, počevši od ovog znaka, potrebno je što više znakova koji čine valjanu predstavu s pomičnom zarezom i pretvaraju ih u vrijednost s pomičnom zarezom. Sve što je ostalo od niza nakon zadnjeg važećeg znaka, pohranjuje se u objekt usmjeren krajem.
Primjer 5: funkcija strtod () s vodećim razmakom
#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; )
Kada pokrenete program, izlaz će biti:
25,5 na Double = 25,5 Krajnji niz = abc11,20 do Double = 0 Krajnji niz = abc11,20