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

wcstombs函数


概要:
#include <stdlib.h>
size_t wcstombs(char * restrict s, 
      const wchar_t * restrict pwcs,
      size_t n);

描述:

该函数将宽字符序列转换为多字节字符序列。

该函数将参数pwcs指向数组中的宽字符序列转换为以初始移位状态开始的对应的多字节字符序列,并将多字节字符序列存入参数s指向的数组中,直至存入n个字节或者存入空字符。除了wctomb函数的转换状态不受影响,每个宽字符的转换就像调用wctomb函数一样。参数s指向的数组中最多n个字节会被修改。


如果复制发生在重叠对象之间,函数行为是未定义的。

wcstombs函数会受当前语言环境LC_CTYPE类别的影响。

ISO/IEC 9899:2018标准定义了该函数的安全版本wcstombs_s


参数:
char * restrict s

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

const wchar_t * restrict pwcs

指向存储宽字符序列数组的指针。

size_t n

存入数组的多字节字符序列的最大字节数。


返回值:

如果遇到无对应有效多字节字符的宽字符,函数返回(size_t)(-1);如果未遇到无对应有效多字节字符的宽字符,函数返回存入数组的字节数,不包括终止空字符(如果存在终止空字符。)。


范例:
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 
/*函数wcstombs范例*/

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

#define LENGTH 20

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

    size_t i = 0;
    size_t number;              //存储转换得到的多字节字符序列的字节数。
    char arr[LENGTH];           //存储转换得到的多字节字符序列。
    const wchar_t wStr[] = L"国庆节";

    /*宽字符序列转换成多字节字符序列前。*/
    printf("转换前宽字符序列(不包括终止空宽字符)");
    printf("共%zu个宽字符,", sizeof(wStr)/sizeof(wStr[0])-1);
    printf("各个宽字符的值分别是:\n");
    while(wStr[i] != 0)
    {
        printf("%X ", wStr[i++]);
    }
    puts("");

    /*宽字符序列转换成多字节字符序列。*/
    number = wcstombs(arr, wStr, LENGTH);

    /*宽字符序列转换成多字节字符序列后。*/
    printf("转换后得到的多字节字符序列占有%zu个字节,", number);
    printf("各个字节的值分别是:\n");
    for(i=0; i<number; ++i)
    {
        printf("%0X ", (unsigned char)arr[i]);
    }
        
    return 0;
}


输出:

转换前宽字符序列(不包括终止空宽字符)共3个宽字符,各个宽字符的值分别是:

56FD 5E86 8282

转换后得到的多字节字符序列占有9个字节,各个字节的值分别是:

E5 9B BD E5 BA 86 E8 8A 82

注:使用ideone编译。


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