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

mbsrtowcs_s函数


概要:
#define __STDC_WANT_LIB_EXT1__ 1
#include <wchar.h>
errno_t mbsrtowcs_s(size_t * restrict retval,
      wchar_t * restrict dst, rsize_t dstmax,
      const char ** restrict src, rsize_t len, 
      mbstate_t * restrict ps);

描述:

该函数将参数src间接指向的数组中多字节字符序列转换为对应的宽字符序列(多字节字符序列开始时的转换状态使用参数ps指向的对象描述。)。如果参数dst不是空指针,转换得到的宽字符将存入参数dst指向的数组;转换直至并包括终止空字符,转换得到的终止空宽字符也会被保存。


两种情况下转换会提前终止:

1、转换遇到不能构成有效多字节字符的字节序列。

2、如果参数dst不是空指针,已有len个宽字符存入参数dst指向的数组。

:如果参数dst是空指针,参数len值可被忽略。


如果参数dst不是空指针,且没有空宽字符存入参数dst指向的数组,函数将dst[len]设置为空宽字符。每次转换都像调用一次mbrtowc函数。

如果参数dst不是空指针,将为参数src指向的指针对象分配一个空指针(如果由于到达终止空字符而停止转换。)或者刚刚转换的最后一个多字节字符的地址(如果存在。)。如果转换由于到达终止空字符而停止,并且参数dst不是空指针,结果状态将是初始转换状态。

无论参数dst是否为空指针,如果输入转换遇到不能构成有效多字节字符的字节序列,将发生编码错误,函数将(size_t)(-1)存储到*retval,并且转换状态是不确定的;否则函数将成功转换的多字节字符数(不包括终止空字符)存储到*retval


mbsrtowcs_s函数返回时,参数dst指向的数组中mbsrtowcs_s函数写入的终止空宽字符(如果有)之后的所有元素值都是未指定的。

如果复制发生在重叠对象之间,对象值是不确定的。


运行约束:

参数retvalsrc*srcps不能是空指针。如果参数dst是空指针,参数dstmax应等于0。如果参数dst不是空指针,参数len和参数dstmax应不大于RSIZE_MAX/sizeof(wchar_t)。如果参数dst不是空指针,且参数len不小于参数dstmax*src指向数组的前dstmax个多字节字符中应存在空字符。

如果存在运行约束冲突,mbsrtowcs_s函数执行以下操作:如果参数retval不是空指针,函数将*retval设置为(size_t)(-1);如果参数dst不是空指针,并且参数dstmax大于0且不大于RSIZE_MAX/sizeof(wchar_t),函数将dst[0]设置为空宽字符。


参数:
size_t * restrict retval

指向size_t类型对象的指针,指向的对象存储成功转换的多字节字符数。

wchar_t * restrict dst

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

rsize_t dstmax

参数dst指向数组可以写入宽字符的最大数量。

const char ** restrict src

指向多字节字符序列的指针。

rsize_t len

指定最多可以存储的宽字符数。

mbstate_t * restrict ps

指向mbstate_t类型对象的指针,指向对象记录关联多字节字符的当前转换状态。


返回值:

如果不存在运行约束冲突和编码错误,函数返回0;否则函数返回非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 
/*安全函数mbsrtowcs_s范例*/

#define __STDC_WANT_LIB_EXT1__ 1
#include <locale.h>
#include <string.h>
#include <wchar.h>

#define LENGTH 10

int main(void)
{
    setlocale(LC_ALL, "");
    
    const char *str = "\u6211\u7231\u4E2D\u56FD";
    wchar_t wStr[LENGTH];
    mbstate_t state;
    size_t retval;
    
    memset(&state, 0, sizeof(state));
    if(!(mbsrtowcs_s(&retval, wStr, LENGTH, &str, LENGTH, &state)))
       wprintf_s(L"%ls\n", wStr);

    return 0;
}


输出:

我爱中国

注:使用Visual Studio编译。


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