当前位置: C语言 -- 附录 -- wctomb_s

wctomb_s函数


概要:
#define __STDC_WANT_LIB_EXT1__ 1
#include <stdlib.h>
errno_t wctomb_s(int * restrict status,
      char * restrict s,
      rsize_t smax,
      wchar_t wc);

描述:

假设n表示与宽字符wc对应的多字节字符的字节数,包括移位序列(shift sequences)。

该函数确定n的值,并将参数wc对应的多字节字符的表示形式存储到参数s指向的数组(如果参数s不是空指针。)。存储的字符数应不大于宏MB_CUR_MAXsmax。如果参数wc是空宽字符,将存入空字节,并且该空字节会被前置用以恢复初始移位状态(initial shift state)的移位序列,并且函数处于初始转换状态(initial conversion state)。

如果参数s是空指针,函数根据多字节字符编码是否依赖状态(state-dependent encodings),向参数status指向的对象存入非0值或者0

在参数s不是空指针的情况下,如果参数wc存在对应的有效多字节字符,函数向参数status指向的对象存入n;如果参数wc不存在对应的有效多字节字符,函数向参数status指向的对象存入-1

任何情况下,参数status指向对象的值都不能大于宏MB_CUR_MAX


wctomb_s函数会受当前语言环境LC_CTYPE类别的影响。对于依赖状态的编码,如果参数s为空指针,调用函数会将其置于初始转换状态。随后在参数s不是空指针的情况下调用该函数,内部转换状态将根据需要进行改变。改变LC_CTYPE类别会导致函数的转换状态不确定。

实现应像没有库函数调用wctomb_s函数一样。


运行约束:

如果参数s不是空指针,参数smax应不小于n,并且参数smax应不大于宏RSIZE_MAX。如果参数s是空指针,参数smax应等于0

如果存在运行约束冲突,函数wctomb_s不会修改参数status指向的整数;并且如果参数s不是空指针,函数访问参数s指向数组中最多smax个元素。


参数:
int * restrict status

int类型指针,指向对象存储多字节字符序列的长度。

char * restrict s

指向char类型数组的指针,转换的多字节字符将存放在该数组中。

rsize_t smax

参数s指向数组中最多可以访问的数组元素数。

wchar_t wc

wchar_t类型的宽字符。


返回值:

如果调用成功,函数返回0;如果存在运行约束冲突或者参数wc没有对应的有效多字节字符,函数返回非0值。


范例:
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 
/*安全函数wctomb_s范例*/

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <stdlib.h>

#define LENGTH 100

void outputCharacter(wchar_t wCh)
{
    char arr[LENGTH];
    int status;
    
    if(!wctomb_s(&status, arr, LENGTH, wCh))
    {
        for(int i=0; i<status; ++i)
            printf_s("%#X\n", arr[i]);
    }
    else
        exit(EXIT_FAILURE);
}

int main(void)
{
    const wchar_t wStr[] = L"Love";
    
    for(size_t i=0; i<sizeof(wStr)/sizeof(wchar_t); ++i)
        outputCharacter(wStr[i]);
    
    return 0;
}


输出:

0X4C

0X6F

0X76

0X65

0

注:使用Visual Studio编译。


相关内容:
wctomb 将宽字符转换为多字节字符序列的函数。