strtof , strtod 或str完型子例程

用途

将字符串转换为双精度数字。

语法

#include <stdlib.h>

float strtof (nptr, endptr)
const char *restrict nptr;
char **restrict endptr;

double strtod ( nptr,  endptr)
const char *nptr
char**endptr;

long double strtold (nptr, endptr)
const char *restrict nptr;
char **restrict endptr;

描述

strtofstrtodstr保持 子例程将 nptr 指向的字符串的初始部分转换为 double。 分别为 floatlong double 表示。 首先,它们将输入字符串分解为三个部分:
  • 空格字符的初始序列 (可能为空) (由 isspace () 指定)。
  • 解释为浮点常量或表示无穷大或 NaN的主体序列。
  • 一个或多个无法识别的字符的最终字符串,包括输入字符串的终止空字节。

然后,它们尝试将主题序列转换为浮点数,并返回结果。

主题序列的期望形式是可选的加号或减号,以及下列其中一项:
  • 十进制数字的非空序列 (可选) ,其中包含基数字符和可选的指数部分
  • 0x 或 0X,以及可选包含基数字符和可选二进制指数部分的十六进制数字的非空序列
  • INF 或 INFINITY 之一,忽略大小写
  • NAN 或 NAN 之一 (n-char-sequence opt ) ,忽略 NAN 部分中的大小写,其中:
    n-char-sequence:
    	 	digit
     		nondigit
    		n-char-sequence digit
    		n-char-sequence nondigit

主题序列定义为输入字符串的最长初始子序列,从第一个非空格字符开始,即期望的格式。 如果输入字符串不是期望的格式,那么主题序列不包含任何字符。

如果主题序列具有浮点数的期望格式,那么以第一个数字或小数点字符 (以先出现者为准) 开头的字符序列将被解释为 C 语言的浮动常数,只不过使用了基数字符来代替句点,并且如果十进制浮点数中既未出现指数部分也未出现基数字符,或者如果二进制指数部分未出现在十六进制浮点数中, 假定值为零的相应类型的指数部分跟在字符串中的最后一个数字之后。

如果主题序列以减号开头,那么该序列将解释为求反。 字符序列 INF 或 INFINITY 应解释为无穷大 (如果在返回类型中可表示) ,否则将其视为对于返回类型的范围过大的浮动常量。 如果返回类型支持,字符序列 NAN 或 NAN(n-char-sequenceopt) 将被解释为静态NaN,,否则将被解释为不具有预期形式的主语序列部分。 n-char 序列的含义是实现定义的。 指向最终字符串的指针存储在 endptr 参数指向的对象中,前提是 endptr 参数不是空指针。

如果主体序列具有十六进制格式,那么转换产生的值将正确舍入。

在程序的语言环境 (类别 LC_NUMERIC) 中定义了基数字符。 在 POSIX 语言环境中,或者在未定义基字符的语言环境中,基字符缺省为句点。

在非 C 或 POSIX 语言环境中,可以接受其他实现定义的主题序列。

如果主题序列为空或没有期望的格式,那么不应执行任何转换; str 的值存储在 endptr指向的对象中,前提是 endptr 不是空指针。

如果成功, strtod 子例程不会更改 errno 全局变量的设置。

由于 0 是在出错时返回的,并且也是成功时的有效返回,因此希望检查错误情况的应用程序应该将 errno 设置为 0 ,调用 strtof str被告知 子例程,然后检查 errno

注:IBM® 具有技术级别的 AIX® 6 7IBM 具有技术级别的 AIX 7 1开始,对于双精度值和长整型双精度值,浮点转换例程, printf 和 scanf 系列函数的精度已从 17 位增加到 37 位。

参数

描述
nptr 指定要转换的字符串。
端点 指向最终字符串。

返回值

成功完成后, strtofstr报 子例程将返回转换后的值。 如果无法执行转换,那么将返回 0 ,并且 errno 全局变量可以设置为 EINVAL。

如果正确的值超出可表示值的范围,那么将返回 HUGE_VALHUGE_VALFHUGE_VALL (根据值的符号) ,并将 errno 设置为 ERANGE。

如果正确的值将导致下流,那么将返回其量级不大于返回类型中最小规范化正数的值,并且 errno 全局变量将设置为 ERANGE。

错误代码

注: 由于 0 的值可能指示错误或有效结果,因此检查 strtod strtof错误的应用程序。 并且 str报 子例程应该在子例程调用之前将 errno 全局变量设置为等于 0。 应用程序可以在子例程调用后检查 errno 全局变量。

如果 NumberPointer 指向的字符串为空或以无法识别的字符开头,那么将针对 strtodstrtofstr保持 子例程返回值 0。

如果无法执行转换,那么将返回值 0 ,并设置 errno 全局变量以指示错误。

如果转换导致溢出 (即,该值超出可表示值的范围) ,那么将返回 +/- HUGE_VAL ,并带有指示溢出方向的符号。 并且 errno 全局变量设置为 ERANGE

如果转换将导致下流,那么将返回正确签名的值 0 ,并且 errno 全局变量将设置为 ERANGE

对于 "、"字符串和 "被搁置"子程序,如果参数 "EndPointer的值不是(char**)空,则指向停止子程序的字符的指针将保存在 "*EndPointer中。 如果无法形成浮点数值,*EndPointer将被设置为NumberPointer。

strtof 子例程只有一个舍入错误。 (如果使用 strtod 子例程来创建双精度浮点数,然后将该双精度数转换为浮点数,那么可能会发生两个舍入错误。)