C参考手册
字符串 | Strings
wcrtomb
在头文件<wchar.h>中定义 |
|
|
|---|---|---|
|
(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是空指针。 -
ssz是零或大于RSIZE_MAX(除非s为空) -
ssz小于将被写入的字节数(除非s为空) -
s是一个空指针,但ssz不是零
作为所有边界检查函数,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):
- 7.29.6.3.3 wcrtomb函数(p: 444)
- K.3.9.3.1.1 wcrtomb_s函数(p: 647-648)
- C99标准(ISO/IEC 9899:1999):
- 7.24.6.3.3 wcrtomb函数(p: 390)
另请参阅
wctombwctomb_s(C11) |
将宽字符转换为其多字节表示(函数) |
|---|---|
mbrtowc(C95) |
将下一个多字节字符转换为宽字符,给定状态(函数) |
| 用于wcrtomb |的C ++文档
加载中,请稍侯......