mbstowcs, mbstowcs_s
来自 zh.cppreference.net
| 定义于头文件 <stdlib.h>
|
||
size_t mbstowcs( wchar_t* dst, const char* src, size_t len)
|
(1) | (直到 C99) |
size_t mbstowcs( wchar_t* restrict dst, const char* restrict src, size_t len)
|
(自 C99) | |
errno_t mbstowcs_s(size_t* restrict retval, wchar_t* restrict dst,
rsize_t dstsz, const char* restrict src, rsize_t len);
|
(2) | (自 C11) |
1) 将多字节字符串从首元素由
src 指向的数组转换为其宽字符表示。转换后的字符存储在 dst 指向的数组的连续元素中。写入目标数组的宽字符不超过 len 个。 每个字符的转换如同调用 mbtowc,但 mbtowc 的转换状态不受影响。转换在以下情况下停止:
- 多字节空字符被转换并存储。
- 遇到(在当前 C 本地环境中)无效的多字节字符。
- 下一个要存储的宽字符将超过
len。
如果
src 和 dst 重叠,则行为未定义。2) 与 (1) 相同,但:
- 转换如同由 mbrtowc 进行,而非 mbtowc
- ;该函数通过输出参数
retval - 返回结果;如果写入
dst的宽字符之后没有空字符,且已写入len个宽字符,则将L'\0'存入dst[len],这意味着总共写入 len+1 个宽字符; - 如果
dst是空指针,则将可能产生的宽字符数存入*retval - ;该函数会覆盖目标数组中从终止空字符到
dstsz - 之间的部分;如果
src和dst重叠,则行为未指定。 - 以下错误在运行时检测并调用当前安装的 约束处理程序函数:
retval或src是空指针dstsz或len大于 RSIZE_MAX / sizeof(wchar_t)(除非dst为空)dstszdst不为零(除非- 为空)
dstszsrc数组的前len个多字节字符中没有空字符,且dstsz大于dst(除非
- 为空)
mbstowcs_s与所有边界检查函数一样,__STDC_LIB_EXT1__仅当实现定义了__STDC_WANT_LIB_EXT1__且用户在包含1stdlib.h< 之前将 > 定义为整数常量
参阅
注解mbstowcs在大多数实现中, 在处理字符串时会更新一个类型为 mbstate_t 的全局静态对象,因此不能同时由两个线程调用;在这种情况下应使用 mbsrtowcs
。
dstPOSIX 指定了一个常见扩展:如果 dst 是空指针,此函数返回如果转换则会写入 mbstowcs_s 的宽字符数。类似的行为对 和 mbsrtowcs
是标准的。
| 参数 | dst | - |
| 指向将存储宽字符串的宽字符数组的指针 | src | - |
| 指向待转换的空终止多字节字符串首元素的指针 | len | - |
| dst 所指向数组中可用的宽字符数 | dstsz | -
dst将写入的最大宽字符数( |
| 数组的大小) | retval | - |
指向 size_t 对象的指针,结果将存储在该对象中
返回值1)
L'\0' 成功时,返回写入目标数组的宽字符数(不包括终止的 (size_t)-1)。发生转换错误(遇到无效多字节字符)时,返回 。2)
dst 成功时返回零(此时已写入或将要写入 *retval 的宽字符数(不包括终止零)存储在 (size_t)-1 中),错误时返回非零。发生运行时约束冲突时,将 *retval 存入 retval(除非 dst[0] 为空)并将 L'\0' 设置为 dst(除非 dstmax 为空或 为零或大于 RSIZE_MAX)
示例
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
int main(void)
{
setlocale(LC_ALL, "en_US.utf8");
const char* mbstr = u8"z\u00df\u6c34\U0001F34C"; // or u8"zß水🍌"
wchar_t wstr[5];
mbstowcs(wstr, mbstr, 5);
wprintf(L"MB string: %s\n", mbstr);
wprintf(L"Wide string: %ls\n", wstr);
}
运行此代码
MB string: zß水🍌
Wide string: zß水🍌
输出:
- 引用标准
- C23 标准 (ISO/IEC 9899:2024):
- 7.22.8.1 mbstowcs 函数 (p: TBD)
- K.3.6.5.1 mbstowcs_s 函数 (p: TBD)
- C17 标准 (ISO/IEC 9899:2018):
- 7.22.8.1 mbstowcs 函数 (p: TBD)
- K.3.6.5.1 mbstowcs_s 函数 (p: TBD)
- C11 标准 (ISO/IEC 9899:2011):
- 7.22.8.1 mbstowcs 函数 (p: 359)
- K.3.6.5.1 mbstowcs_s 函数 (p: 611-612)
- C99 标准 (ISO/IEC 9899:1999):
- 7.20.8.1 mbstowcs 函数 (p: 323)
- C89/C90 标准 (ISO/IEC 9899:1990):
4.10.8.1 mbstowcs 函数
mbsrtowcs_s(C95) |
(C11) 将窄多字节字符串转换为宽字符串,给定状态 |
wcstombs_s |
(C11) 将宽字符串转换为窄多字节字符串 |
(函数)C++ 文档 对于
| |