当前位置: C语言 -- 标准库 -- <wchar.h> -- wcstold

wcstold函数


概要:
#include <wchar.h>
long double wcstold(const wchar_t * restrict nptr,
      wchar_t ** restrict endptr);

描述:

该函数将参数nptr指向宽字符串的初始部分转换为long double类型的浮点表示。

该函数首先将宽字符串分成三个部分:

1、一个初始的,可能为空的,空格宽字符(可以使用iswspace函数检查。)序列;

2、一个类似浮点常量,或者表示无穷大或者非数值的主题序列;

3、由一个或者多个未识别宽字符组成的最终宽字符串(final wide string),包括宽字符串末尾的终止空宽字符;

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


主题序列的预期形式可能包含+号或者-号,其后应为下述形式之一:

- 一个由十进制数构成的非空序列(可能包含小数点。),其后还可能包含ISO/IEC 9899:2018标准第6.4.4.2 Floating constants节中为相应单字节字符定义的指数部分;

- 一个以0x或者0X开头,由十六进制数构成的非空序列(可能包含小数点。),其后还可能包含ISO/IEC 9899:2018标准第6.4.4.2 Floating constants节中定义的二进制指数部分;

- INF或者INFINITY,或者任何其它等价宽字符串(忽略大小写。);

- NAN或者NAN(n-wchar-sequenceopt),或者任何其它等价宽字符串(其中NAN部分忽略大小写。),n-wchar-sequenceopt由具体实现定义。


主题序列从第一个非空格宽字符开始,应包含符合上述形式的尽可能多的宽字符。如果宽字符串不符合上述预期形式,主题序列将不包含任何宽字符。

如果主题序列具有浮点数的预期形式,以第一个数字宽字符或者小数点宽字符(以先出现者为准。)开始的宽字符序列根据ISO/IEC 9899:2018标准第6.4.4.2 Floating constants节的规则解释为浮点常量;除了小数点宽字符用于代替句号,并且如果指数部分和小数点宽字符都没有出现在十进制浮点数中,或者如果二进制指数部分没有出现在十六进制浮点数中,具有0值的适当类型的指数部分假定在字符串的最后一个数字之后。


如果主题序列以-号开始,序列会被解释为取反(ISO/IEC 9899:2018标准并未明确规定以-号开始的序列是直接转换成负数,还是通过转换相应的无符号序列产生的值取反;如果舍入方向是正无穷大或者负无穷大,这两种方法可能会产生不同的结果。无论哪种情况,如果浮点算术支持带符号的0,函数将遵循0的符号。)。

如果可以使用返回类型表示,宽字符序列INF或者INFINITY解释为无穷大;否则宽字符序列INF或者INFINITY对于返回类型而言就像一个非常大的浮点常量。

如果返回类型支持,宽字符序列NAN或者NAN(n-wchar-sequenceopt)解释为安静非数值(quiet NaN);否则宽字符序列NAN或者NAN(n-wchar-sequenceopt)就像不具有预期形式的主题序列部分,n-wchar-sequenceopt的含义由实现定义。


如果参数endptr不是空指针,指向最终宽字符串的指针存储在参数endptr指向的对象中。

如果主题序列具有十六进制形式,并且FLT_RADIX2的幂,转换得到的值能够正确地舍入。非“C”语言环境中,还可以接受特定语言环境的主题序列。

如果主题序列为空或者不符合预期形式,将不进行任何转换;参数nptr的值将存入参数endptr指向的对象中(前提是参数endptr不是空指针。)。


参数:
const wchar_t * restrict nptr

指向被转换的宽字符串的指针。

wchar_t ** restrict endptr

指向一个wchar_t *类型对象的指针,指向对象值为宽字符串中数字值之后的下一个宽字符的地址。该参数也可以是一个空指针,这种情况下它不会被使用。


返回值:

函数返回转换后的值;如果没有发生转换,函数返回0.0

如果转换结果溢出(overflow)返回类型所能表示的范围,并且默认舍入有效,函数将根据返回值的符号返回正HUGE_VALL或者负HUGE_VALL,并将errno设置为ERANGE

如果结果发生下溢(underflow),函数将返回一个绝对值不大于返回类型最小正规格化数(the smallest normalized positive number)的值,errno是否设置为ERANGE将由实现定义。


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
/*函数wcstold范例*/

#include <wchar.h>
#include <wctype.h>

int main(void)
{
    const wchar_t wStr[] = L"3.14 -1.5 INF NAN 0x1b abc";
    const wchar_t *ptr = wStr;
    wchar_t *element = NULL;
    long double number;

    for(; ptr != element; number=wcstold(ptr, &element))
    {
        /*让指针指向第一个非空格宽字符。*/
        while(iswspace(*ptr))
            ++ptr;

        number = wcstold(ptr, &element);
        wprintf(L"%.*ls: %Lf\n", (element-ptr), ptr, number);
        ptr = element;
    }

    return 0;
}


输出:

3.14: 3.140000

-1.5: -1.500000

INF: inf

NAN: nan

0x1b: 27.000000

注:使用Visual Studio编译。


相关内容:
wcstof 将宽字符串转换为float类型浮点数的函数。
wcstod 将宽字符串转换为double类型浮点数的函数。