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

wcsxfrm函数


概要:
#include <wchar.h>
size_t wcsxfrm(wchar_t * restrict s1,
      const wchar_t * restrict s2,
      size_t n);

描述:

该函数根据当前语言环境的LC_COLLATE类别转换参数s2指向的宽字符串,然后将转换结果存入参数s1指向的数组。

使用wcscmp函数比较两个转换后的宽字符串,将返回一个大于、等于或者小于0的值,该值与使用wcscoll函数比较相同源字符串的结果相同。最多n个宽字符(包括终止空宽字符)存入参数s1指向的数组。如果参数n的值为0,参数s1可以是空指针。如果复制发生在重叠对象之间,函数行为是未定义的。


存储s2指向宽字符串转换结果的数组所需大小可使用以下表达式计算:

1 + wcsxfrm(NULL, s2, 0)


参数:
wchar_t * restrict s1

指向目标数组的指针,结果字符串将存入该数组。

const wchar_t * restrict s2

指向源字符串的指针。

size_t n

最多可以存入参数s1指向数组的宽字符数。


返回值:

函数返回转换后宽字符串的长度,但不包括终止空宽字符。如果返回值大于等于参数n,参数s1指向数组的内容是不确定的。


范例:
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 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
/*函数wcsxfrm范例*/

#include <locale.h>
#include <stdlib.h>
#include <wchar.h>

/*输出宽字符串比较结果的函数。*/
void func(int value, const wchar_t *s1, const wchar_t *s2)
{
    if(value>0)
        wprintf(L"%ls 大于 %ls。\n", s1, s2);
    else if(value<0)
        wprintf(L"%ls 小于 %ls。\n", s1, s2);
    else
        wprintf(L"%ls 等于 %ls。\n", s1, s2);
}

int main(void)
{
    setlocale(LC_ALL, "");

    const wchar_t s1[] = L"南京";
    const wchar_t s2[] = L"上海";
    size_t n1 = 1 + wcsxfrm(NULL,s1,0);
    size_t n2 = 1 + wcsxfrm(NULL,s2,0);
    int value;
    wchar_t *t1;
    wchar_t *t2;

    /*分配内存存储转换后的宽字符串。*/
    if((t1 = calloc(n1, sizeof(wchar_t))) == NULL)
        exit(EXIT_FAILURE);

    if((t2 = calloc(n2, sizeof(wchar_t))) == NULL)
        exit(EXIT_FAILURE);

    /*转换前。*/
    wprintf(L"转换前:\n");

    /*使用wcscmp函数比较源字符串。*/
    value = wcscmp(s1, s2);
    wprintf(L"wcscmp: ");
    func(value, s1, s2);

    /*使用wcscoll函数比较源字符串。*/
    value = wcscoll(s1, s2);
    wprintf(L"wcscoll: ");
    func(value, s1, s2);

    wprintf(L"\n");

    /*转换宽字符串。*/
    wcsxfrm(t1, s1, n1);
    wcsxfrm(t2, s2, n2);

    /*转换后。*/
    wprintf(L"转换后:\n");

    /*使用wcscmp函数比较转换后宽字符串。*/
    value = wcscmp(t1, t2);
    wprintf(L"wcscmp: ");
    func(value, s1, s2);

    /*释放内存。*/
    free(t1);
    free(t2);
    
    return 0;
}


输出:

转换前:

wcscmp: 南京 大于 上海。

wcscoll: 南京 小于 上海。

 

转换后:

wcscmp: 南京 小于 上海。

:使用Visual Studio编译。

由于Visual Studio编译器不支持变长数组,所以这里使用内存管理函数calloc分配内存,存储转换后的宽字符串。


相关内容:
wmemcmp 比较内存区域宽字符序列的函数。
wcscmp 比较宽字符串的函数。
wcscoll 比较宽字符串的函数。
wcsncmp 比较宽字符串前n个宽字符的函数。