非常教程

C参考手册

字符串 | Strings

wcsrtombs_s

在头文件<wchar.h>中定义

(1)

size_t wcsrtombs(char * dst,const wchar_t ** src,size_t len,mbstate_t * ps);

(自C95以来)

size_t wcsrtombs(char * restrict dst,const wchar_t ** restrict src,size_t len,mbstate_t * restrict ps);

(自C99以来)

errno_t wcsrtombs_s(size_t * restrict retval,char * restrict dst,rsize_t dstsz,const wchar_t ** restrict src,rsize_t len,mbstate_t * restrict ps);

(2)

(自C11以来)

1)将第一个元素指向的数组中的宽字符序列转换为*src以多字节表示形式开始的窄多字节表示形式,该表示形式由以下描述的转换状态开始*ps。如果dst不为空,则转换的字符将存储在指向的char数组的连续元素中dst。不超过len字节被写入目标数组。

每个字符都像通过呼叫一样转换wcrtomb。在下列情况下停止转换:

*空字符L'\0'被转换并存储。在这种情况下存储的字节是非转移序列(如果需要),其后是'\0'*src设置为NULL*ps表示初始转换状态。

发现 * wchar_t不对应于当前C语言环境 中的有效字符。*src被设置为指向第一个未转换的宽字符。

*要存储的下一个多字节字符将超过len*src被设置为指向第一个未转换的宽字符。如果不检查这个条件dst==NULL

2)与(1)相同,除此之外

*该函数将其结果作为out参数返回 retval

*如果转换在不写入空字符的情况下停止,函数将存储'\0'在下一个字节中dst,该字节可以是dst[len]或者dst[dstsz]]先到达的任意一个(意味着最多可以写入len + 1/dstsz + 1总字节)。在这种情况下,在终止空值之前可能没有写入不偏移的序列。

*该函数从终止null和直到clobbers目的地数组 dstsz

*如果srcdst重叠,行为是未指定的。

*在运行时检测到以下错误并调用当前安装的约束处理函数:

  • retvalpssrc,或*src为空指针
  • dstszlen大于RSIZE_MAX(除非dst为空)
  • dstsz不为零(除非dst为空)
  • len大于dstsz并且转换在到达src时间时不会遇到null或编码错误dstsz(除非dst为空)

与所有边界检查的函数一样,wcsrtombs_s只有__STDC_LIB_EXT1__在实现定义并且用户在包含之前定义__STDC_WANT_LIB_EXT1__为整数常量时1才能保证可用wchar.h

参数

dst

-

缩小字符数组的指针,以便存储多字节字符

src

-

指向指向空终止宽字符串的第一个元素的指针

len

-

由dst指向的数组中可用的字节数

ps

-

指向转换状态对象的指针

dstsz

-

将被写入的最大字节数(dst数组的大小)

retval

-

指向将存储结果的size_t对象的指针

返回值

1)成功时,返回'\0'写入第一个元素指向的字符数组的字节数(包括任何移位序列,但不包括终止)dst。如果dst==NULL返回将要写入的字节数。在转换错误(如果遇到无效的宽字符),退货(size_t)-1,专卖店EILSEQerrno和叶*ps未指定状态。

2)如果成功则返回零(在这种情况下不包括终止零那名,或将被写入到的字节数dst,被存储在*retval上的误差),非零。在运行时约束违反的情况下,存储(size_t)-1*retval(除非retval为空),并设置dst[0]'\0'(除非dst为空或dstmax为零或大于RSIZE_MAX

示例

#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <wchar.h>
 
void print_wide(const wchar_t* wstr)
{
    mbstate_t state;
    memset(&state, 0, sizeof state);
    int len = 1 + wcsrtombs(NULL, &wstr, 0, &state);
    char mbstr[len];
    wcsrtombs(mbstr, &wstr, len, &state);
    printf("Multibyte string: %s\n", mbstr);
    printf("Length, including '\\0': %d\n", len);
}
 
int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    print_wide(L"z\u00df\u6c34\U0001f34c"); // or L"zß水?"
}

输出:

Multibyte string: zß水?
Length, including '\0': 11

参考

  • C11标准(ISO/IEC 9899:2011):
    • 7.29.6.4.2 wcsrtombs函数(p: 446)
    • K.3.9.3.2.2 wcsrtombs_s函数(p: 649-651)
  • C99标准(ISO/IEC 9899:1999):
    • 7.24.6.4.2 wcsrtombs函数(p: 392)

另请参阅

wcstombswcstombs_s(C11)

将宽字符串转换为窄多字节字符串(函数)

wcrtombwcrtomb_s(C95)(C11)

将宽字符转换为其多字节表示,给定状态(函数)

mbsrtowcsmbsrtowcs_s(C95)(C11)

将一个窄多字节字符串转换为宽字符串,给定状态(函数)

| 用于wcsrtombs的C ++文档

C

C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。