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

wcstoll函数


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

描述:

该函数将参数nptr指向宽字符串的初始部分转换为long long int类型整数表示形式。

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

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

2、一个类似整数(参数base确定其基数。)的主题序列;

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

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


如果参数base值为0,主题序列的预期形式是ISO/IEC 9899:2024标准第6.4.5.2 Integer constants节中描述的整数常量格式(即主题序列可能是十进制、八进制、十六进制或者二进制形式。);主题序列前可能存在+号或者–号,但主题序列不包括整数后缀和数位分隔符(digit separators)。

如果参数base值在2到36之间(包括2和36。),主题序列的预期形式是一个由字母和数字构成的表示整数的序列,参数base确定其基数;主题序列前可能存在+号或者–号,但主题序列不包括整数后缀和数位分隔符(digit separators)。字母a至z(或者字母A至Z)表示值10至35。只有当字母和数字的值小于参数base值时,字母和数字才是有效的。如果参数base值为16,字符0x或者0X是可选的;如果存在字符0x或者0X,其位置应在符号之后,字母和数字序列之前。如果参数base值为2,字符0b或者0B是可选的;如果存在字符0b或者0B,其位置应在符号之后,字母和数字序列之前。


主题序列从第一个非空格宽字符开始、包含符合预期形式的、尽可能多宽字符的最长初始子序列。如果宽字符串为空,或者如果宽字符串完全由空格宽字符组成,或者如果第一个非空格宽字符不是符号(±),也不是允许的字母或者数字,主题序列将不包含任何宽字符。

如果主题序列具有预期形式,并且参数base值为0,从第一个数字开始的字符序列将根据ISO/IEC 9899:2024标准第6.4.5.2 Integer constants节的规则解释为整数常量。

如果主题序列具有预期形式,并且参数base值在2到36之间(包括2和36。),参数base将用作转换的基数,字母根据上述规则(即字母a至z(或者字母A至Z)表示值10至35。)获取值。

如果主题序列以-号开头,转换得到的值会被取反。


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

非“C”语言环境中,还可以接受特定语言环境的主题序列。

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


参数:
const wchar_t * restrict nptr

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

wchar_t ** restrict endptr

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

int base

基数,决定了有效宽字符及其解释。


返回值:

如果发生转换,函数返回转换后的值;如果没有发生转换,函数返回0。如果转换结果超出返回类型所能表示的范围,函数返回LLONG_MIN或者LLONG_MAX,并将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 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
/*函数wcstoll范例*/

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

int main(void)
{
    const wchar_t wStr[] = L"2017 0101 0x1a1a -6982 abc";
    const wchar_t *wPtr = wStr;
    wchar_t *endPtr = NULL;
    long long int number;

    while(*wPtr != L'\0')
    {
        /*让指针指向第一个非空格宽字符。*/
        while(iswspace(*wPtr))
            ++wPtr;
            
        /*如果到达宽字符串末尾,将退出循环。*/
        if(*wPtr == L'\0')
            break;
            
        /*将宽字符串初始部分转换成浮点数。*/
        errno = 0;
        number = wcstoll(wPtr, &endPtr, 0);
            
        if(endPtr == wPtr)
        {
            wprintf(L"%lc: not a number\n", *wPtr);
            ++wPtr;
            continue;
        }
        
        if(errno == ERANGE)
        {
            fputws(L"Error; out of range.", stderr);
            errno = 0;
        }
        else
        {
            wprintf(L"%.*ls: %lld\n", (int)(endPtr-wPtr), wPtr, number);
        }

        /*移动指针wPtr,准备转换下一个浮点数。*/
        wPtr = endPtr;
    }

    return 0;
}


输出:

2017: 2017

0101: 65

0x1a1a: 6682

-6982: -6982

a: not a number

b: not a number

c: not a number


相关内容:
wcstol 将宽字符串转换为long int类型整数的函数。
wcstoull 将宽字符串转换为unsignd long long int类型整数的函数。


主要参考资料:

1、ISO/IEC 9899:2024

2、ISO/IEC 9899:2018