当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


C++ strtod()用法及代码示例


C++ 中的strtod() 函数将字符串的内容解释为浮点数并将其值作为双精度值返回。

该函数还设置一个指针,指向字符串的最后一个有效字符之后的第一个字符(如果有),否则该指针设置为空。

对于基数 10 和字符串 "12abc"

有效数字部分 -> 12

有效数字部分后的第一个字符 -> a

它在<cstdlib> 头文件中定义。

strtod()原型

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

strtod() 函数将字符串和指向字符的指针作为其参数,将字符串的内容解释为 float 数字并返回 double 值。

参数:

  • str:具有浮点数表示的字符串。
  • end: 对已分配的 char* 类型对象的引用。 end 的值由函数设置为 str 中最后一个有效字符之后的下一个字符。该参数也可以是空指针,在这种情况下不使用。

返回:

strtod() 函数返回:

  • 一个双精度值(从字符串转换而来)。
  • 如果无法执行有效转换,则为 0.0。

如果转换后的值超出范围,则会发生范围错误并返回正数或负数HUGE_VAL。

示例 1:strtod() 函数如何工作?

#include <iostream>
#include <cstdlib>

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;
}

运行程序时,输出将是:

Number in End String = 12.44b 0xy
Number in Double = 12.44
String = b 0xy

示例 2:strtod() 函数没有尾随字符

#include <iostream>
#include <cstdlib>

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;
}

运行程序时,输出将是:

Number in End String = 12.44b 0xy
Number in Double = 12.44
Null pointer

strtod() 函数的有效浮点值包含可选的 + 或 - 符号,后跟以下集合之一:

  • 对于十进制浮点值

    • 一组十进制数字 (0-9),可选择包含小数点 (.)。
      例如:13.170、-5.63 等。

    • 可选的 index 部分(e 或 E),后跟可选的 + 或 - 符号和非空的十进制数字序列。
      例如:3.46101e+007、13.19e-013等。

  • 对于十六进制浮点值

    • 以 0x 或 0X 开头的字符串,后跟一个非空的十六进制数字序列,可以选择包含小数点 (.)。
      例如:0xfa5、-0xb1f.24 等。

    • 可选的 index 部分(p 或 P),后跟可选的 + 或 - 符号和非空的十六进制数字序列。
      例如:0x51c.23p5、-0x2a.3p-3 等。

  • Infinity

    • INF 或 INFINITY(忽略大小写)。
      例如:-Inf、InfiNiTy 等。

  • NaN(不是数字)

    • NAN 或 NANsequence(忽略大小写),其中 sequence 是仅由字母数字字符或下划线 (_) 组成的字符序列。结果是一个安静的 NaN。
      例如:Nan、NaNab1 等。

示例 3:strtod() 如何与 index 和十六进制一起使用?

#include <iostream>
#include <cstring>
#include <cstdlib>

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;
}

运行程序时,输出将是:

Number in String = -44.01e-3End String
Number in Double = -0.04401
End String = End String
Number in String = 0xf1bc.51hello
Number in Double = 61884.3
End String = hello

示例 4:infinity 和 NaN 的 strtod 案例

#include <iostream>
#include <cstdlib>

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;
}

运行程序时,输出将是:

INFINITY to Double = inf
End String =

Infabc to Double = inf
End String = abc

NaN12a to Double = nan
End String = 12a

通常,strtod() 函数的有效浮点参数具有以下形式:

[空白] [- | +] [数字] [.digits] [ {e | E }[- | +]数字]

strtod() 函数会忽略所有前导空白字符,直到找到主要的非空白字符。

然后,从这个字符开始,尽可能多的字符组成一个有效的浮点表示并将它们转换为浮点值。在最后一个有效字符之后字符串的剩余部分存储在 end 指向的对象中。

示例 5:strtod() 带有前导空格的函数

#include <iostream>
#include <cstdlib>

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;
}

运行程序时,输出将是:

25.5 to Double = 25.5
End String =

abc11.20 to Double = 0
End String = abc11.20

相关用法


注:本文由纯净天空筛选整理自 C++ strtod()。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。