函数
<cstdlib>

strtod

double strtod (const char* str, char** endptr);
将字符串转换为 double
解析 C 字符串 str,将其内容解释为(根据当前区域设置的)浮点数,并返回其 double 类型的值。如果 endptr 不是空指针,该函数还会设置 endptr 的值,使其指向数字之后的第一个字符。

该函数首先丢弃尽可能多的空白字符(如同在 isspace 中),直到找到第一个非空白字符。然后,从这个字符开始,获取尽可能多的有效字符,这些字符遵循类似于浮点数字面量的语法(见下文),并将其解释为数值。一个指向最后一个有效字符之后剩余字符串的指针被存储在 endptr 所指向的对象中。

对于使用 "C" 区域设置的 strtod,一个有效的浮点数由一个可选的符号字符(+-)开头,后跟一串数字,这串数字可以包含一个小数点(.),并可选地后跟一个指数部分(一个 eE 字符,后跟一个可选的符号和一串数字)。
对于使用 "C" 区域设置的 strtod,一个有效的浮点数由一个可选的符号字符(+-)开头,后跟以下之一:
- 一串数字,可选地包含一个小数点(.),可选地后跟一个指数部分(一个 eE 字符,后跟一个可选的符号和一串数字)。
- 一个 0x0X 前缀,后跟一串十六进制数字(如同在 isxdigit 中),可选地包含一个分隔整数和小数部分的句点。可选地后跟一个 2 的幂次指数(一个 pP 字符,后跟一个可选的符号和一串十六进制数字)。
- INFINFINITY(忽略大小写)。
- NANNAN序列(忽略大小写),其中序列是一串字符,每个字符要么是字母数字字符(如同在 isalnum 中),要么是下划线字符(_)。

如果 str 中的第一个非空白字符序列不构成刚才描述的有效浮点数,或者如果不存在这样的序列(因为 str 为空或只包含空白字符),则不执行任何转换,函数返回一个零值。

参数

str
以浮点数表示形式开头的 C 字符串。
endptr
对一个已分配的 char* 类型对象的引用,其值由函数设置为 str 中数值之后的下一个字符。
此参数也可以是空指针,此时它将不被使用。

返回值

成功时,函数返回转换后的浮点数,类型为 double
如果无法执行有效的转换,函数返回零(0.0)。
如果正确的值超出了该类型可表示值的范围,则返回一个正或负的 HUGE_VAL,并且 errno 被设置为 ERANGE
如果正确的值会导致下溢,函数将返回一个其绝对值不大于最小规格化正数的值,并将 errno 设置为 ERANGE
如果正确的值会导致下溢,函数将返回一个其绝对值不大于最小规格化正数的值(某些库实现也可能在这种情况下将 errno 设置为 ERANGE)。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* strtod example */
#include <stdio.h>      /* printf, NULL */
#include <stdlib.h>     /* strtod */

int main ()
{
  char szOrbits[] = "365.24 29.53";
  char* pEnd;
  double d1, d2;
  d1 = strtod (szOrbits, &pEnd);
  d2 = strtod (pEnd, NULL);
  printf ("The moon completes %.2f orbits per Earth year.\n", d1/d2);
  return 0;
}

输出

The moon completes 12.37 orbits per Earth year.


数据竞争

str 指向的数组被访问,endptr 指向的指针被修改(如果非空)。

异常 (C++)

无异常保证:此函数从不抛出异常。

如果 str 没有指向一个有效的 C 字符串,或者 endptr 没有指向一个有效的指针对象,将导致未定义行为

另见