C ++ strtod () - Libreria standard C ++

La funzione strtod () in C ++ interpreta il contenuto di una stringa come un numero in virgola mobile e restituisce il suo valore come double.

Questa funzione imposta anche un puntatore in modo che punti al primo carattere dopo l'ultimo carattere valido della stringa, se presente, altrimenti il ​​puntatore viene impostato su null.

Per la base 10 e la stringa "12abc"

Parte numerica valida -> 12

Primo carattere dopo una parte numerica valida -> a

È definito nel file di intestazione.

prototipo strtod ()

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

La funzione strtod () accetta una stringa e un puntatore a un carattere come parametro, interpreta il contenuto della stringa come un floatnumero e restituisce un doublevalore.

Parametri strtod ()

  • str : una stringa con la rappresentazione di un numero in virgola mobile.
  • end : riferimento a un oggetto già allocato di tipo char *. Il valore di end è impostato dalla funzione sul carattere successivo in str dopo l'ultimo carattere valido. Questo parametro può anche essere un puntatore nullo, nel qual caso non viene utilizzato.

strtod () Restituisce il valore

La funzione strtod () 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, si verifica un errore di intervallo e viene restituito un valore HUGE_VAL positivo o negativo.

Esempio 1: come funziona la funzione 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; ) 

Quando esegui il programma, l'output sarà:

 Numero in stringa finale = 12.44b 0xy Numero in Double = 12.44 Stringa = b 0xy

Esempio 2: funzione strtod () senza caratteri finali

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

Quando esegui il programma, l'output sarà:

 Number in End String = 12.44b 0xy Number in Double = 12.44 Puntatore nullo

Un valore a virgola mobile valido per la funzione strtod () è 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: 13.170, -5.63, ecc.

    • Una parte esponente facoltativa (e o E) seguita da un segno + o - facoltativo e da una sequenza non vuota di cifre decimali.
      Ad esempio: 3.46101e + 007, 13.19e-013, ecc.

  • Per il valore in virgola mobile esadecimale :

    • Una stringa che inizia con 0x o 0X, seguita da una sequenza non vuota di cifre esadecimali, contenente facoltativamente un punto decimale (.).
      Ad esempio: 0xfa5, -0xb1f.24, ecc.

    • Una parte esponente facoltativa (p o P) seguita da un segno + o - facoltativo e una sequenza non vuota di cifre esadecimali.
      Ad esempio: 0x51c.23p5, -0x2a.3p-3, ecc.

  • Infinito :

    • INF o INFINITY (ignorando maiuscole e minuscole).
      Ad esempio: -Inf, InfiNiTy, ecc.

  • NaN (non un numero) :

    • NAN o NANsequence (ignorando maiuscole e minuscole) dove sequenza è una sequenza di caratteri composta solo da caratteri alfanumerici o dal trattino basso (_). Il risultato è un NaN silenzioso.
      Ad esempio: Nan, NaNab1, ecc.

Esempio 3: come funziona strtod () con esponenti ed esadecimali?

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

Quando esegui il programma, l'output sarà:

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

Esempio 4: casi strtod per INFINITY e 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; ) 

Quando esegui il programma, l'output sarà:

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

In generale, un argomento in virgola mobile valido per la funzione strtod () ha la seguente forma:

(spazi) (- | +) (cifre) (.digits) ((e | E) (- | +) cifre)

La funzione strtod () 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 memorizzato nell'oggetto puntato da end.

Esempio 5: funzione strtod () con spazi bianchi iniziali

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

Quando esegui il programma, l'output sarà:

 Da 25,5 a Double = 25,5 End String = abc11.20 a Double = 0 End String = abc11.20

Articoli interessanti...