strtod
, _strtod_l
, wcstod
, _wcstod_l
Converte cadeias de caracteres em um valor de precisão dupla.
Sintaxe
double strtod(
const char *strSource,
char **endptr
);
double _strtod_l(
const char *strSource,
char **endptr,
_locale_t locale
);
double wcstod(
const wchar_t *strSource,
wchar_t **endptr
);
double _wcstod_l(
const wchar_t *strSource,
wchar_t **endptr,
_locale_t locale
);
Parâmetros
strSource
Cadeia de caracteres terminada em nulo a ser convertida.
endptr
Ponteiro para o caractere que interrompe a verificação.
locale
A localidade a ser usada.
Valor retornado
strtod
retorna o valor do número de ponto flutuante, exceto quando a representação causaria um estouro. Nesse caso, a função retorna +/-HUGE_VAL
. O sinal de HUGE_VAL
coincide com o sinal do valor que não pode ser representado. strtod
retornará 0
se nenhuma conversão puder ser realizada ou ocorrer um estouro negativo.
wcstod
retorna valores de maneira semelhante a strtod
:
- Para ambas as funções,
errno
será definido comoERANGE
se ocorrer um estouro ou estouro negativo. - Se houver parâmetros inválidos,
errno
será definido comoEINVAL
e o manipulador de parâmetro inválido será invocado, conforme descrito em Validação de parâmetro.
Para obter mais informações sobre esses e outros códigos de retorno, confira errno
, _doserrno
, _sys_errlist
e _sys_nerr
.
Comentários
Cada função converte a cadeia de caracteres de entrada strSource
para um double
. A função strtod
converte strSource
para um valor de precisão dupla. strtod
interrompe a leitura da cadeia de caracteres strSource
no primeiro caractere que ela não puder reconhecer como parte de um número. Este pode ser o caractere nulo de terminação. wcstod
é uma versão de caractere largo de strtod
; seu argumento strSource
é uma cadeia de caracteres largos. Caso contrário, essas funções se comportam de forma idêntica.
Por padrão, o estado global dessa função tem como escopo o aplicativo. Para alterar esse comportamento, confira Estado global no CRT.
Mapeamentos de rotina de texto genérico
Rotina TCHAR.H |
_UNICODE e _MBCS não definidos |
_MBCS definido |
_UNICODE definido |
---|---|---|---|
_tcstod |
strtod |
strtod |
wcstod |
_tcstod_l |
_strtod_l |
_strtod_l |
_wcstod_l |
A configuração de categoria LC_NUMERIC
da localidade atual determina o reconhecimento do caractere de ponto fracionário em strSource
. Para obter mais informações, consulte setlocale
. As funções sem o sufixo _l
usam a localidade atual. _strtod_l
é idêntico a _strtod
, exceto que o primeiro usa o locale
informado. Para obter mais informações, consulte Localidade.
Se endptr
não for NULL
, um ponteiro para o caractere que parou a verificação será armazenado no local apontado por endptr
. Se nenhuma conversão pode ser executada (Nenhum dígito válido foi encontrado ou uma base inválida foi especificada), o valor de strSource
é armazenado no local apontado pela endptr
.
strtod
espera que strSource
aponte para uma cadeia de caracteres em um dos seguintes formatos:
[whitespace
] [sign
] {digits
[radix
digits
] | radix
digits
} [{e
| E
} [sign
] digits
]
[whitespace
] [sign
] {0x
0X
| } {hexdigits
[radix
hexdigits
] | } radix
hexdigits
[{p
| P
} [sign
] digits
]
[whitespace
] [sign
] {INF
| INFINITY
}
[whitespace
] [sign
] NAN
[sequence
]
O whitespace
à esquerda opcional pode consistir em caracteres de espaço ou tabulação, que são ignorados.
sign
é mais (+) ou menos (-).
digits
é um ou mais dígitos decimais.
hexdigits
é um ou mais dígitos hexadecimais.
radix
é o caractere de ponto fracionário, um ponto (.) na localidade padrão "C" ou o valor específico da localidade se a localidade atual for diferente ou quando locale
for especificado.
Um sequence
é uma sequência de caracteres alfanuméricos ou sublinhados.
Nas formas de número decimal e hexadecimal, se nenhum dígito for exibido antes do caractere de ponto fracionário, pelo menos um deverá aparecer após o caractere de ponto fracionário.
Os dígitos decimais podem ser seguidos por um expoente, que consiste em uma letra de apresentação (e
ou E
) e, opcionalmente, um inteiro com sinal.
Os dígitos hexadecimais podem ser seguidos por um expoente, que consiste em uma letra de apresentação (p
ou P
) e, opcionalmente, um inteiro com sinal, que representa o expoente elevado a dois.
Em qualquer forma, se não houver uma parte expoente ou um caractere de ponto fracionário, um caractere de ponto fracionário será assumido para seguir o último dígito na cadeia de caracteres.
As maiúsculas e minúsculas são ignoradas nos formulários INF
e NAN
. O primeiro caractere que não se ajusta a um desses formulários interrompe a verificação.
As versões UCRT dessas funções não dão suporte para a conversão de letras de expoente do estilo Fortran (d
ou D
). Essa extensão não padrão tinha suporte em versões anteriores do CRT e pode ser uma alteração significativa para seu código. As versões UCRT dão suporte a cadeias de caracteres hexadecimais e ciclo completo dos valores INF
e NAN
, que não eram compatíveis com versões anteriores. Esse suporte também pode causar alterações significativas em seu código. Por exemplo, a cadeia de caracteres "0x1a
" seria interpretada por strtod
como 0.0 em versões anteriores, mas como 26.0 na versão UCRT.
Requisitos
Rotina | Cabeçalho necessário |
---|---|
strtod , _strtod_l |
C: <stdlib.h> C++: <cstdlib> ou <stdlib.h> |
wcstod , _wcstod_l |
C: <stdlib.h> ou <wchar.h> C++: <cstdlib> , <stdlib.h> ou <wchar.h> |
Para obter informações sobre compatibilidade, consulte Compatibilidade.
Exemplo
// crt_strtod.c
// This program uses strtod to convert a
// string to a double-precision value; strtol to
// convert a string to long integer values; and strtoul
// to convert a string to unsigned long-integer values.
//
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
char *string, *stopstring;
double x;
long l;
int base;
unsigned long ul;
string = "3.1415926This stopped it";
x = strtod(string, &stopstring);
printf("string = %s\n", string);
printf(" strtod = %f\n", x);
printf(" Stopped scan at: %s\n\n", stopstring);
string = "-10110134932This stopped it";
l = strtol(string, &stopstring, 10);
printf("string = %s\n", string);
printf(" strtol = %ld\n", l);
printf(" Stopped scan at: %s\n\n", stopstring);
string = "10110134932";
printf("string = %s\n", string);
// Convert string using base 2, 4, and 8:
for (base = 2; base <= 8; base *= 2)
{
// Convert the string:
ul = strtoul(string, &stopstring, base);
printf(" strtol = %ld (base %d)\n", ul, base);
printf(" Stopped scan at: %s\n", stopstring);
}
// NaN
x = strtod("+nan", &stopstring);
printf("\n%f\n", x);
// INF
x = strtod("-INF", &stopstring);
printf("\n%f\n", x);
// e - exponent
x = strtod("1.18973e+49", &stopstring);
printf("\n%f\n", x);
// doesn't handle Fortran style
x = strtod("1.18973d+49", &stopstring);
printf("\n%f\n", x);
printf("No Fortran style support. Stopped parsing at %s\n", stopstring);
}
string = 3.1415926This stopped it
strtod = 3.141593
Stopped scan at: This stopped it
string = -10110134932This stopped it
strtol = -2147483648
Stopped scan at: This stopped it
string = 10110134932
strtol = 45 (base 2)
Stopped scan at: 34932
strtol = 4423 (base 4)
Stopped scan at: 4932
strtol = 2134108 (base 8)
Stopped scan at: 932
nan
-inf
11897299999999999421285862642874618947301378359296.000000
1.189730
No Fortran style support. Stopped parsing at d+49
Confira também
Conversão de dados
Suporte matemático e de ponto flutuante
Interpretação de sequências de caracteres multibyte
Localidade
String para funções de valor numérico
strtol
, wcstol
, _strtol_l
, _wcstol_l
strtoul
, _strtoul_l
, wcstoul
, _wcstoul_l
atof
, _atof_l
, _wtof
, _wtof_l
localeconv
_create_locale
, _wcreate_locale
_free_locale