A função strtod () em C ++ interpreta o conteúdo de uma string como um número de ponto flutuante e retorna seu valor como um duplo.
Esta função também define um ponteiro para apontar para o primeiro caractere após o último caractere válido da string, se houver algum, caso contrário, o ponteiro é definido como nulo.
Para a base 10 e a string "12abc"
Parte numérica válida -> 12
Primeiro caractere após a parte numérica válida -> a
É definido no arquivo de cabeçalho.
protótipo strtod ()
strtod duplo (const char * str, char ** end);
A função strtod () leva string e um ponteiro para caractere como seu parâmetro, interpreta o conteúdo da string como um float
número e retorna um double
valor.
Parâmetros strtod ()
- str : Uma string com a representação de um número de ponto flutuante.
- end : Referência a um objeto já alocado do tipo char *. O valor de fim é definido pela função para o próximo caractere em str após o último caractere válido. Este parâmetro também pode ser um ponteiro nulo, caso em que não é usado.
strtod () Valor de retorno
A função strtod () retorna:
- um valor duplo (que é convertido da string).
- 0,0 se nenhuma conversão válida puder ser realizada.
Se o valor convertido estiver fora da faixa, ocorre um erro de faixa e um HUGE_VAL positivo ou negativo é retornado.
Exemplo 1: Como funciona a função 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 você executa o programa, a saída será:
Número na string final = 12,44b 0xy Número duplo = 12,44 string = b 0xy
Exemplo 2: função strtod () sem caracteres finais
#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 você executa o programa, a saída será:
Número na string final = 12,44b 0xy Número duplo = 12,44 Ponteiro nulo
Um valor de ponto flutuante válido para a função strtod () consiste em um sinal opcional + ou - seguido por um dos seguintes conjuntos:
-
Para valor de ponto flutuante decimal :
-
Um grupo de dígitos decimais (0-9), contendo opcionalmente um ponto decimal (.).
Por exemplo: 13,170, -5,63, etc. -
Uma parte expoente opcional (e ou E) seguida por um sinal opcional + ou - e uma sequência não vazia de dígitos decimais.
Por exemplo: 3.46101e + 007, 13.19e-013, etc.
-
-
Para valor de ponto flutuante hexadecimal :
-
Uma string começando com 0x ou 0X, seguida por uma sequência não vazia de dígitos hexadecimais, opcionalmente contendo um ponto decimal (.).
Por exemplo: 0xfa5, -0xb1f.24, etc. -
Uma parte expoente opcional (p ou P) seguida por um sinal opcional + ou - e uma sequência não vazia de dígitos hexadecimais.
Por exemplo: 0x51c.23p5, -0x2a.3p-3, etc.
-
-
Infinito :
-
INF ou INFINITY (ignorando maiúsculas e minúsculas).
Por exemplo: -Inf, InfiNiTy, etc.
-
-
NaN (não é um número) :
-
NAN ou NANsequence (ignorando maiúsculas e minúsculas), em que sequência é uma sequência de caracteres que consiste apenas em caracteres alfanuméricos ou o sublinhado (_). O resultado é um NaN silencioso.
Por exemplo: Nan, NaNab1, etc.
-
Exemplo 3: Como strtod () funciona com expoentes e hexadecimais?
#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 você executa o programa, a saída será:
Número na String = -44.01e-3End String Number in Double = -0.04401 End String = End String Número na String = 0xf1bc.51hello Number in Double = 61884.3 End String = hello
Exemplo 4: Casos strtod para 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 você executa o programa, a saída será:
INFINITY to Double = inf End String = Infabc to Double = inf End String = abc NaN12a to Double = nan End String = 12a
Em geral, um argumento de ponto flutuante válido para a função strtod () tem o seguinte formato:
(espaço em branco) (- | +) (dígitos) (. dígitos) ((e | E) (- | +) dígitos)
A função strtod () ignora todos os caracteres de espaço em branco iniciais até que o caractere de espaço em branco principal seja encontrado.
Então, começando com este caractere, ele pega tantos caracteres quanto possíveis que formam uma representação de ponto flutuante válida e os converte em um valor de ponto flutuante. O que restar da string após o último caractere válido é armazenado no objeto apontado por end.
Exemplo 5: função strtod () com espaço em branco à esquerda
#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 você executa o programa, a saída será:
25,5 para Double = 25,5 End String = abc11.20 para Double = 0 End String = abc11.20