Namespaces
Variants

strtof, strtod, strtold

From cppreference.net
< c ‎ | string ‎ | byte
Definido en el encabezado <stdlib.h>
float strtof ( const char * restrict str, char ** restrict str_end ) ;
(1) (desde C99)
(2)
double strtod ( const char * str, char ** str_end ) ;
(hasta C99)
double strtod ( const char * restrict str, char ** restrict str_end ) ;
(desde C99)
long double strtold ( const char * restrict str, char ** restrict str_end ) ;
(3) (desde C99)

Interpreta un valor de punto flotante en una cadena de bytes apuntada por str .

La función descarta cualquier carácter de espacio en blanco (según lo determinado por isspace ) hasta que se encuentra el primer carácter que no es un espacio en blanco. Luego toma tantos caracteres como sea posible para formar una representación válida de punto flotante y los convierte en un valor de punto flotante. El valor válido de punto flotante puede ser uno de los siguientes:

  • expresión decimal de punto flotante. Consta de las siguientes partes:
  • (opcional) signo más o menos
  • secuencia no vacía de dígitos decimales que opcionalmente contiene el carácter de punto decimal (según lo determinado por la localidad actual de C) (define el significando)
  • (opcional) e o E seguido de signo menos o más opcional y secuencia no vacía de dígitos decimales (define el exponente en base 10 )
  • expresión de punto flotante hexadecimal. Consiste de las siguientes partes:
  • (opcional) signo más o menos
  • 0x o 0X
  • secuencia no vacía de dígitos hexadecimales que opcionalmente contiene un carácter de punto decimal (según lo determinado por la localidad actual de C) (define el significando)
  • (opcional) p o P seguido de signo menos o más opcional y secuencia no vacía de dígitos decimales (define el exponente en base 2 )
  • expresión de infinito. Consiste de las siguientes partes:
  • (opcional) signo más o menos
  • INF o INFINITY ignorando mayúsculas/minúsculas
  • expresión de no-es-un-número. Consiste de las siguientes partes:
  • (opcional) signo más o menos
  • NAN o NAN( char_sequence  ) ignorando mayúsculas/minúsculas de la parte NAN . char_sequence solo puede contener dígitos, letras latinas y guiones bajos. El resultado es un valor de punto flotante NaN silencioso.
(desde C99)
  • cualquier otra expresión que pueda ser aceptada por la configuración regional de C actualmente instalada locale .

Las funciones establecen el puntero apuntado por str_end para que apunte al carácter posterior al último carácter interpretado. Si str_end es un puntero nulo, se ignora.

Contenidos

Parámetros

str - puntero a la cadena de bytes terminada en nulo que se va a interpretar
str_end - puntero a un puntero a carácter

Valor de retorno

Valor de punto flotante correspondiente al contenido de str en caso de éxito. Si el valor convertido queda fuera del rango del tipo de retorno correspondiente, ocurre un error de rango ( errno se establece a ERANGE ) y se retorna HUGE_VAL , HUGE_VALF o HUGE_VALL . Si no se puede realizar ninguna conversión, se retorna 0 .

Ejemplo

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    // análisis con manejo de errores
    const char* p = "111.11 -2.22 Nan nan(2) inF 0X1.BC70A3D70A3D7P+6  1.18973e+4932zzz";
    printf("Analizando '%s':\n", p);
    char* end = NULL;
    for (double f = strtod(p, &end); p != end; f = strtod(p, &end))
    {
        printf("'%.*s' -> ", (int)(end - p), p);
        p = end;
        if (errno == ERANGE)
        {
            printf("error de rango, se obtuvo ");
            errno = 0;
        }
        printf("%f\n", f);
    }
    // análisis sin manejo de errores
    printf("\"  -0.0000000123junk\"  -->  %g\n", strtod("  -0.0000000123junk", NULL));
    printf("\"junk\"                 -->  %g\n", strtod("junk", NULL));
}

Salida posible:

Analizando '111.11 -2.22 Nan nan(2) inF 0X1.BC70A3D70A3D7P+6  1.18973e+4932zzz':
'111.11' -> 111.110000
' -2.22' -> -2.220000
' Nan' -> nan
' nan(2)' -> nan
' inF' -> inf
' 0X1.BC70A3D70A3D7P+6' -> 111.110000
'  1.18973e+4932' -> error de rango, se obtuvo inf
"  -0.0000000123junk"  -->  -1.23e-08
"junk"                 -->  0

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 7.22.1.3 Las funciones strtod, strtof y strtold (p: TBD)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.22.1.3 Las funciones strtod, strtof y strtold (p: 249-251)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.22.1.3 Las funciones strtod, strtof y strtold (p: 342-344)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.20.1.3 Las funciones strtod, strtof y strtold (p: 308-310)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 4.10.1.4 La función strtod

Véase también

convierte una cadena de bytes a un valor de punto flotante
(función)
(C99) (C95) (C99)
convierte una cadena ancha a un valor de punto flotante
(función)
C++ documentation para strtof , strtod , strtold