La funzione atof () in C ++ interpreta il contenuto di una stringa come un numero in virgola mobile e restituisce il suo valore come un double.
prototipo atof ()
doppio atof (const char * str);
È definito nel file di intestazione.
atof () Parametri
- str - Una stringa con la rappresentazione di un numero in virgola mobile.
atof () Restituisce il valore
La funzione atof () restituisce:
- un valore doppio (che viene convertito dalla stringa).
- 0.0 se non è stato possibile eseguire una conversione valida.
Se il valore convertito non rientra nell'intervallo, provoca un comportamento indefinito.
Esempio 1: come funziona la funzione 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; )
Quando esegui il programma, l'output sarà:
Numero in stringa = -32,40 Numero in doppio = -32,4
Un valore in virgola mobile valido per la funzione atof () è costituito da un segno + o - opzionale seguito da uno dei seguenti insiemi:
- Per il valore a virgola mobile decimale:
- Un gruppo di cifre decimali (0-9) , contenente facoltativamente un punto decimale (.). Ad esempio: 9.056, -0.013, ecc.
- Una parte esponente facoltativa (
e
oE
) seguita da un segno + o - facoltativo e da una sequenza non vuota di cifre decimali. Ad esempio: 1.23455e + 009, 5.23e-018, ecc.
- Per il valore in virgola mobile esadecimale:
- Una stringa che inizia con
0x
o0X
, seguita da una sequenza non vuota di cifre esadecimali, contenente facoltativamente un punto decimale (.). Ad esempio: 0xf1b, -0xb1b.51, ecc. - Una parte esponente opzionale (
p
oP
) seguita da un segno + o - opzionale e una sequenza non vuota di cifre esadecimali. Ad esempio: 0x51c.23p5, -0x2a.3p-3, ecc.
- Una stringa che inizia con
- Infinito:
INF
oINFINITY
(ignorando maiuscole e minuscole). Ad esempio: -iNf, INfINiTy, ecc.
- NaN (non un numero):
NAN
oNANsequence
(ignorando le maiuscole / minuscole) dove sequenza è una sequenza di caratteri composta solo da caratteri alfanumerici o dal trattino basso (_). Il risultato è un NaN silenzioso. Ad esempio: Nan, NaN12, ecc.
Esempio 2: come atof () funziona con esponenti ed esadecimali?
#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; )
Quando esegui il programma, l'output sarà:
Da -44.01e-3 a Double = -44.01 da -44.01e-3 a Double = -0.04401 Da 0xf1bc a Double = 61884 da 0xf1bc.51 a Double = 61884.3
Esempio 3: atof Cases per INFINITY e 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; )
Quando esegui il programma, l'output sarà:
INFINITY to Double = inf Inf to Double = inf Nan to Double = nan NAN to Double = nan
In generale, un argomento in virgola mobile valido per la funzione atof () ha la seguente forma:
(spazi) (- | +) (cifre) (.digits) ((e | E) (- | +) cifre)
La funzione atof () ignora tutti i caratteri di spazi bianchi iniziali fino a quando non viene trovato il carattere principale diverso da spazi.
Quindi, a partire da questo carattere, prende il maggior numero di caratteri possibile che forma una valida rappresentazione in virgola mobile e li converte in un valore in virgola mobile. Tutto ciò che resta della stringa dopo l'ultimo carattere valido viene ignorato e non ha alcun effetto sul risultato.
Esempio 4: funzione atof () con spazi bianchi e caratteri finali
#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; )
Quando esegui il programma, l'output sarà:
Da 25,5 a Double = 25,5 Da 25,5 a Double = 25,5 Da 25,5abcd a Double = 25,5 abcd Da 25,5 a Double = 0 INFINITYabcd a Double = inf INFINITY a Double = inf Nanlll a Double = nan