C ++ strtod () - Biblioteca C ++ Padrão

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 floatnúmero e retorna um doublevalor.

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

Artigos interessantes...