函数
<cstdlib>

strtof

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

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

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

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

参数

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

返回值

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

示例

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

int main ()
{
  char szOrbits[] = "686.97 365.24";
  char* pEnd;
  float f1, f2;
  f1 = strtof (szOrbits, &pEnd);
  f2 = strtof (pEnd, NULL);
  printf ("One martian year takes %.2f Earth years.\n", f1/f2);
  return 0;
}

输出
One martian year takes 1.88 Earth years.


数据竞争

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

异常 (C++)

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

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

另见