C ++ strtod () - Biblioteca estándar de C ++

La función strtod () en C ++ interpreta el contenido de una cadena como un número de punto flotante y devuelve su valor como un doble.

Esta función también establece un puntero para apuntar al primer carácter después del último carácter válido de la cadena si lo hay, de lo contrario, el puntero se establece en nulo.

Para base 10 y la cadena "12abc"

Parte numérica válida -> 12

Primer carácter después de una parte numérica válida -> a

Está definido en el archivo de encabezado.

prototipo strtod ()

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

La función strtod () toma una cadena y un puntero a un carácter como parámetro, interpreta el contenido de la cadena como un floatnúmero y devuelve un doublevalor.

strtod () Parámetros

  • str : una cadena que tiene la representación de un número de punto flotante.
  • end : Referencia a un objeto ya asignado de tipo char *. El valor de end lo establece la función al siguiente carácter de cadena después del último carácter válido. Este parámetro también puede ser un puntero nulo, en cuyo caso no se utiliza.

strtod () Valor de retorno

La función strtod () devuelve:

  • un valor doble (que se convierte de la cadena).
  • 0.0 si no se pudo realizar una conversión válida.

Si el valor convertido está fuera del rango, se produce un error de rango y se devuelve un HUGE_VAL positivo o negativo.

Ejemplo 1: ¿Cómo funciona la función 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; ) 

Cuando ejecute el programa, la salida será:

 Número en la cadena final = 12.44b 0xy Número en doble = 12.44 Cadena = b 0xy

Ejemplo 2: función strtod () sin caracteres finales

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

Cuando ejecute el programa, la salida será:

 Número en la cadena final = 12.44b 0xy Número en doble = 12.44 Puntero nulo

Un valor de punto flotante válido para la función strtod () consta de un signo + o - opcional seguido de uno de los siguientes conjuntos:

  • Para el valor de coma flotante decimal :

    • Un grupo de dígitos decimales (0-9), que opcionalmente contiene un punto decimal (.).
      Por ejemplo: 13.170, -5.63, etc.

    • Una parte de exponente opcional (e o E) seguida de un signo + o - opcional y una secuencia no vacía de dígitos decimales.
      Por ejemplo: 3.46101e + 007, 13.19e-013, etc.

  • Para valor de coma flotante hexadecimal :

    • Una cadena que comienza con 0x o 0X, seguida de una secuencia no vacía de dígitos hexadecimales, que opcionalmente contiene un punto decimal (.).
      Por ejemplo: 0xfa5, -0xb1f.24, etc.

    • Una parte de exponente opcional (p o P) seguida de un signo + o - opcional y una secuencia no vacía de dígitos hexadecimales.
      Por ejemplo: 0x51c.23p5, -0x2a.3p-3, etc.

  • Infinito :

    • INF o INFINITY (ignorando el caso).
      Por ejemplo: -Inf, InfiNiTy, etc.

  • NaN (no es un número) :

    • NAN o NANsequence (ignorando el caso) donde la secuencia es una secuencia de caracteres que consta solo de caracteres alfanuméricos o el guión bajo (_). El resultado es un NaN silencioso.
      Por ejemplo: Nan, NaNab1, etc.

Ejemplo 3: ¿Cómo funciona strtod () con exponentes y hexadecimales?

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

Cuando ejecute el programa, la salida será:

 Número en cadena = -44.01e-3 Número de cadena final en doble = -0.04401 Cadena final = Cadena final Número en cadena = 0xf1bc.51 hola Número en doble = 61884.3 Cadena final = hola

Ejemplo 4: casos strtod para INFINITY y 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; ) 

Cuando ejecute el programa, la salida será:

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

En general, un argumento de punto flotante válido para la función strtod () tiene la siguiente forma:

(espacio en blanco) (- | +) (dígitos) (. dígitos) ((e | E) (- | +) dígitos)

La función strtod () ignora todos los espacios en blanco iniciales hasta que se encuentra el carácter primario que no es un espacio en blanco.

Luego, a partir de este carácter, toma tantos caracteres como sea posible que forman una representación de punto flotante válida y los convierte en un valor de punto flotante. Lo que quede de la cadena después del último carácter válido se almacena en el objeto apuntado al final.

Ejemplo 5: función strtod () con espacios en blanco iniciales

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

Cuando ejecute el programa, la salida será:

 25,5 a Doble = 25,5 Cadena final = abc11.20 a Doble = 0 Cadena final = abc11.20

Articulos interesantes...