Funkcja atof () w C ++ interpretuje zawartość łańcucha jako liczbę zmiennoprzecinkową i zwraca jej wartość jako podwójną.
atof () prototyp
double atof (const char * str);
Jest zdefiniowany w pliku nagłówkowym.
atof () Parametry
- str - Łańcuch reprezentujący liczbę zmiennoprzecinkową.
atof () Zwraca wartość
Funkcja atof () 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, powoduje niezdefiniowane zachowanie.
Przykład 1: Jak działa funkcja atof ()?
#include #include using namespace std; int main() ( char numberString() = "-32.40"; double numberInDouble; cout << "Number in String = " << numberString << endl; numberInDouble = atof(numberString); cout << "Number in Double = " << numberInDouble; return 0; )
Po uruchomieniu programu wynik będzie następujący:
Liczba w łańcuchu = -32,40 Liczba w podwójnej = -32,4
Prawidłowa wartość zmiennoprzecinkowa funkcji atof () 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: 9,056, -0,013 itd.
- Opcjonalna część wykładnika (
e
lubE
), po której następuje opcjonalny znak + lub - oraz niepusta sekwencja cyfr dziesiętnych. Na przykład: 1.23455e + 009, 5.23e-018 itd.
- Dla szesnastkowej wartości zmiennoprzecinkowej:
- Ciąg zaczynający się od
0x
lub0X
, po którym następuje niepusta sekwencja cyfr szesnastkowych, opcjonalnie zawierający kropkę dziesiętną (.). Na przykład: 0xf1b, -0xb1b.51 itd. - Opcjonalna część wykładnika (
p
lubP
), po której następuje opcjonalny znak + lub - oraz niepusta sekwencja cyfr szesnastkowych. Na przykład: 0x51c.23p5, -0x2a.3p-3 itd.
- Ciąg zaczynający się od
- Nieskończoność:
INF
lubINFINITY
(ignorując wielkość liter). Na przykład: -iNf, INfINiTy itp.
- NaN (nie liczba):
NAN
lubNANsequence
(pomijając wielkość liter), gdzie sekwencja jest sekwencją znaków składającą się tylko ze znaków alfanumerycznych lub podkreślenia (_) .W rezultacie otrzymujemy cichy NaN. Na przykład: Nan, NaN12 itp.
Przykład 2: Jak atof () działa z wykładnikami i liczbami szesnastkowymi?
#include #include using namespace std; int main() ( cout << "-44.01e-3" << " to Double = " << atof("-44.01e-0") << endl; cout << "-44.01e-3" << " to Double = " << atof("-44.01e-3") << endl; cout << "0xf1bc" << " to Double = " << atof("0xf1bc") << endl; cout << "0xf1bc.51" << " to Double = " << atof("0xf1bc.51") << endl; return 0; )
Po uruchomieniu programu wynik będzie następujący:
-44.01e-3 do podwójnego = -44.01 -44.01e-3 do podwójnego = -0.04401 0xf1bc do podwójnego = 61884 0xf1bc. 51 do podwójnego = 61884,3
Przykład 3: atof Cases for INFINITY i NaN
#include #include using namespace std; int main() ( cout << "INFINITY" << " to Double = " << atof("INFINITY") << endl; cout << "Inf" << " to Double = " << atof("Inf") << endl; cout << "Nan" << " to Double = " << atof("Nan") << endl; cout << "NAN" << " to Double = " << atof("NAN") << endl; return 0; )
Po uruchomieniu programu wynik będzie następujący:
INFINITY to Double = inf Inf to Double = inf Nan to Double = nan NAN to Double = nan
Ogólnie rzecz biorąc, prawidłowy argument zmiennoprzecinkowy funkcji atof () ma następującą postać:
(białe znaki) (- | +) (cyfry) (.digits) ((e | E) (- | +) cyfry)
Funkcja atof () 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 pozostało z ciągu po ostatnim prawidłowym znaku, jest ignorowane i nie ma wpływu na wynik.
Przykład 4: funkcja atof () ze spacjami i znakami końcowymi
#include #include using namespace std; int main() ( cout << "25.5" << " to Double = " << atof(" 25.5") << endl; cout << "25.5 " << " to Double = " << atof(" 25.5 ") << endl; cout << "25.5abcd" << " to Double = " << atof("25.5abcd") << endl; // Returns 0 because of invalid conversion cout << "abcd25.5" << " to Double = " << atof("abcd25.5") << endl; // Rules for whitespace and trailing character also apply for infinity and Nan cout << "INFINITYabcd" << " to Double = " << atof("INFINITYabcd") << endl; cout << "INFINITY" << " to Double = " << atof(" INFINITY") << endl; cout << "Nanlll" << " to Double = " << atof("Nanlll") << endl; return 0; )
Po uruchomieniu programu wynik będzie następujący:
25,5 do Double = 25,5 25,5 do Double = 25,5 25,5 abcd do Double = 25,5 abcd 25,5 do Double = 0 INFINITY abcd do Double = inf INFINITY do Double = inf Nanlll do Double = nan