C ++ strtod () - C ++ standardowa biblioteka

Funkcja strtod () w C ++ interpretuje zawartość łańcucha jako liczbę zmiennoprzecinkową i zwraca jej wartość jako podwójną.

Ta funkcja ustawia również wskaźnik tak, aby wskazywał na pierwszy znak po ostatnim prawidłowym znaku ciągu, jeśli taki istnieje, w przeciwnym razie wskaźnik jest ustawiony na null.

Dla podstawy 10 i ciągu „12abc”

Prawidłowa część numeryczna -> 12

Pierwszy znak po poprawnej części numerycznej -> a

Jest zdefiniowany w pliku nagłówkowym.

strtod () prototyp

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

Funkcja strtod () przyjmuje jako parametr ciąg i wskaźnik do znaku, interpretuje zawartość ciągu jako floatliczbę i zwraca doublewartość.

strtod () Parametry

  • str : łańcuch mający reprezentację liczby zmiennoprzecinkowej.
  • end : odwołanie do już przydzielonego obiektu typu char *. Wartość end jest ustawiana przez funkcję na następny znak w str po ostatnim prawidłowym znaku. Ten parametr może być również pustym wskaźnikiem, w którym to przypadku nie jest używany.

strtod () Zwracana wartość

Funkcja strtod () zwraca:

  • podwójna wartość (która jest konwertowana z łańcucha).
  • 0.0, jeśli nie można przeprowadzić żadnej prawidłowej konwersji.

Jeśli przekonwertowana wartość jest poza zakresem, występuje błąd zakresu i zwracany jest dodatni lub ujemny HUGE_VAL.

Przykład 1: Jak działa funkcja 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; ) 

Po uruchomieniu programu wynik będzie następujący:

 Number in End String = 12,44b 0xy Number in Double = 12,44 String = b 0xy

Przykład 2: funkcja strtod () bez znaków końcowych

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

Po uruchomieniu programu wynik będzie następujący:

 Number in End String = 12,44b 0xy Number in Double = 12,44 Wskaźnik zerowy

Prawidłowa wartość zmiennoprzecinkowa funkcji strtod () składa się z opcjonalnego znaku + lub -, po którym następuje jeden z następujących zestawów:

  • Dla dziesiętnej wartości zmiennoprzecinkowej :

    • Grupa cyfr dziesiętnych (0–9), opcjonalnie zawierająca kropkę dziesiętną (.).
      Na przykład: 13,170, -5,63 itd.

    • Opcjonalna część wykładnika (e lub E), po której następuje opcjonalny znak + lub - oraz niepusta sekwencja cyfr dziesiętnych.
      Na przykład: 3.46101e + 007, 13.19e-013 itd.

  • Dla szesnastkowej wartości zmiennoprzecinkowej :

    • Ciąg zaczynający się od 0x lub 0X, po którym następuje niepusta sekwencja cyfr szesnastkowych, opcjonalnie zawierająca kropkę dziesiętną (.).
      Na przykład: 0xfa5, -0xb1f.24 itd.

    • Opcjonalna część wykładnika (p lub P), po której następuje opcjonalny znak + lub - oraz niepusta sekwencja cyfr szesnastkowych.
      Na przykład: 0x51c.23p5, -0x2a.3p-3 itd.

  • Nieskończoność :

    • INF lub INFINITY (ignorując wielkość liter).
      Na przykład: -Inf, InfiNiTy itp.

  • NaN (nie liczba) :

    • NAN lub NANsequence (ignorując wielkość liter), gdzie sekwencja to ciąg znaków składający się wyłącznie ze znaków alfanumerycznych lub podkreślenia (_). Rezultatem jest cichy NaN.
      Na przykład: Nan, NaNab1 itp.

Przykład 3: Jak strtod () działa z wykładnikami i liczbami szesnastkowymi?

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

Po uruchomieniu programu wynik będzie następujący:

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

Przykład 4: Strtod Cases for 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; ) 

Po uruchomieniu programu wynik będzie następujący:

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

Ogólnie rzecz biorąc, poprawny argument zmiennoprzecinkowy funkcji strtod () ma następującą postać:

(białe znaki) (- | +) (cyfry) (.digits) ((e | E) (- | +) cyfry)

Funkcja strtod () ignoruje wszystkie początkowe białe znaki, dopóki nie zostanie znaleziony główny znak niebędący białymi znakami.

Następnie, zaczynając od tego znaku, przyjmuje jak najwięcej znaków, które tworzą prawidłową reprezentację zmiennoprzecinkową i konwertują je na wartość zmiennoprzecinkową. Cokolwiek zostało z łańcucha po ostatnim prawidłowym znaku, jest przechowywane w obiekcie wskazywanym przez koniec.

Przykład 5: funkcja strtod () z wiodącymi białymi znakami

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

Po uruchomieniu programu wynik będzie następujący:

 25,5 do Double = 25,5 End String = abc11.20 do Double = 0 End String = abc11.20

Interesujące artykuły...