wcrtomb_s
wcrtomb, wcrtomb_s
在头文件 | | |
---|---|---|
| (1) | |
size_t wcrtomb(char * s,wchar_t wc,mbstate_t * ps); | (自C95以来) | |
size_t wcrtomb(char * restrict s,wchar_t wc,mbstate_t * restrict ps); | (自C99以来) | |
errno_t wcrtomb_s(size_t * restrict retval,char * restrict s,rsize_t ssz,wchar_t wc,mbstate_t * restrict ps); | (2) | (自C11以来) |
将宽字符转换为窄多字节表示形式。
1)如果s
不是空指针,则函数确定存储多字节字符表示wc
(包括任何移位序列)所需的字节数,并将多字节字符表示存储在第一个元素指向的字符数组中s
。MB_CUR_MAX
该函数最多可以写入字节。
如果s
是空指针,则该调用等同wcrtomb(buf, L'\0', ps)
于某个内部缓冲区buf
。
如果wc是空宽字符L'\0'
,则存储空字节,之前是恢复初始移位状态所需的任何移位序列,并且*ps
更新转换状态参数以表示初始移位状态。
2)与(1)相同,除此之外
如果s
是空指针,则调用等同于wcrtomb_s(&retval, buf, sizeof buf, L'\0', ps)
内部变量retval
和buf
(其大小大于MB_CUR_MAX
)
结果将返回到out参数retval
中
在运行时检测到以下错误并调用当前安装的约束处理函数:
retval
或者ps
是空指针。
作为所有边界检查函数,wcrtomb_s
只有在被__STDC_LIB_EXT1__
实现定义__STDC_WANT_LIB_EXT1__
并且1
在包含之前用户定义为整数常量时才能保证可用wchar.h
。
参数
s | - | 指向多字节字符将被存储在其中的窄字符数组的指针 |
---|---|---|
wc | - | 宽字符转换 |
ps | - | 指向解释多字节字符串时使用的转换状态对象的指针 |
ssz | - | 最大写入字节数(缓冲区的大小) |
retval | - | 指向外存参数的指针,其中存储结果(多字节字符串中的字节数(包括任何移位序列)) |
返回值
1)成功时,返回写入第一个元素指向的字符数组的字节数(包括任何移位序列)s
。
如果失败(如果wc
不是有效的宽字符),返回(size_t)-1
,储存EILSEQ
的errno
,并留下*ps
未指定状态。
2)成功时返回零,失败时返回非零,在这种情况下,s[0]
设置为'\0'
(除非s
为空或者ssz
为零或大于RSIZE_MAX
)并且*retval
设置为(size_t)-1
(除非retval
为空)
示例
#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <wchar.h>
#include <stdlib.h>
void print_wide(const wchar_t* wstr)
{
mbstate_t state;
memset(&state, 0, sizeof state
char mb[MB_CUR_MAX+1];
for(;*wstr; ++wstr) {
int ret = wcrtomb(mb, *wstr, &state
mb[ret] = '\0';
printf("multibyte char %s is %d bytes\n", mb, ret
}
}
int main(void)
{
setlocale(LC_ALL, "en_US.utf8"
print_wide(L"z\u00df\u6c34\U0001F34C" // or L"zß水?"
}
输出:
multibyte char z is 1 bytes
multibyte char ß is 2 bytes
multibyte char 水 is 3 bytes
multibyte char ? is 4 bytes
参考
- C11标准(ISO/IEC 9899:2011):
另请参阅
wctombwctomb_s(C11) | 将宽字符转换为其多字节表示(函数) |
---|---|
mbrtowc(C95) | 将下一个多字节字符转换为宽字符,给定状态(函数) |
| 用于wcrtomb |的C ++文档