跳到主要内容

C++ atof() 函数

atof() 函数原型

double atof(const char* str);

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

atof() 参数

  • str - 表示浮点数的字符串。

atof() 返回值

atof() 函数返回:

  • 从字符串转换的 double 值。
  • 如果无法进行有效转换,则返回 0.0。

如果转换后的值超出范围,则会导致未定义的行为。

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

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
char numberString[] = "-32.40";
double numberInDouble;
cout << "Number in String = " << numberString << endl;

numberInDouble = atof(numberString);
cout << "Number in Double = " << numberInDouble;

return 0;
}

当你运行程序时,输出将是:

Number in  String = -32.40
Number in Double = -32.4

对于 atof() 函数,有效的浮点数值由以下部分组成:

  • 对于十进制浮点数值:

    • 一组十进制数字 (0-9),可以选择包含一个小数点(.)。例如:9.056, -0.013 等。
    • 一个可选的指数部分(eE),后跟一个可选的 + 或 - 符号和非空的十进制数字序列。例如:1.23455e+009, 5.23e-018 等。

对于十六进制浮点数值:

  • 0x0X 开头的字符串,后跟一个非空的十六进制数字序列,可以选择包含一个小数点(.)。例如:0xf1b, -0xb1b.51 等。
  • 一个可选的指数部分(pP),后跟一个可选的 + 或 - 符号和非空的十六进制数字序列。例如:0x51c.23p5, -0x2a.3p-3 等。

无穷大:

  • INFINFINITY(忽略大小写)。例如:-iNf, INfINiTy 等。

NaN(非数字):

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

示例 2:atof() 如何处理指数和十六进制数?

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{

cout << "-44.01e-0" << " 转换为 Double = " << atof("-44.01e-0") << endl;
cout << "-44.01e-3" << " 转换为 Double = " << atof("-44.01e-3") << endl;

cout << "0xf1bc" << " 转换为 Double = " << atof("0xf1bc") << endl;
cout << "0xf1bc.51" << " 转换为 Double = " << atof("0xf1bc.51") << endl;

return 0;
}
```当你运行程序时,输出将是:

```cpp
-44.01e-3 转换为 Double = -44.01
-44.01e-3 转换为 Double = -0.04401
0xf1bc 转换为 Double = 61884
0xf1bc.51 转换为 Double = 61884.3

示例 3:atof 函数处理 INFINITY 和 NaN 的情况

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
cout << "INFINITY" << " 转换为 Double = " << atof("INFINITY") << endl;
cout << "Inf" << " 转换为 Double = " << atof("Inf") << endl;

cout << "Nan" << " 转换为 Double = " << atof("Nan") << endl;
cout << "NAN" << " 转换为 Double = " << atof("NAN") << endl;

return 0;
}

当你运行程序时,输出将是:

INFINITY 转换为 Double = inf
Inf 转换为 Double = inf
Nan 转换为 Double = nan
NAN 转换为 Double = nan

通常,对于 atof() 函数的有效浮点数参数格式如下:

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

atof() 函数会忽略所有前导空白字符,直到找到第一个非空白字符。

然后,从这个字符开始,它会取尽可能多的字符,以形成一个有效的浮点数表示,并将它们转换为浮点值。字符串中在最后一个有效字符之后的部分将被忽略,并且不会影响结果。

示例 4:atof() 函数处理带有空白字符和尾随字符的情况

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
cout << "25.5" << " 转换为 Double = " << atof(" 25.5") << endl;
cout << "25.5 " << " 转换为 Double = " << atof(" 25.5 ") << endl;
cout << "25.5abcd" << " 转换为 Double = " << atof("25.5abcd") << endl;

// 由于无效转换,返回 0
cout << "abcd25.5" << " 转换为 Double = " << atof("abcd25.5") << endl;

// 对于无穷大和 NaN,空白字符和尾随字符的规则也同样适用
cout << "INFINITYabcd" << " 转换为 Double = " << atof("INFINITYabcd") << endl;
cout << "INFINITY" << " 转换为 Double = " << atof(" INFINITY") << endl;
cout << "Nanlll" << " 转换为 Double = " << atof("Nanlll") << endl;

return 0;
}

当你运行程序时,输出将是:

25.5 转换为 Double = 25.5
25.5 转换为 Double = 25.5
25.5abcd 转换为 Double = 25.5
abcd25.5 转换为 Double = 0
INFINITYabcd 转换为 Double = inf
INFINITY 转换为 Double = inf
Nanlll 转换为 Double = nan