非常教程

C参考手册

字符串 | Strings

wcrtomb_s

在头文件<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(包括任何移位序列)所需的字节数,并将多字节字符表示存储在第一个元素指向的字符数组中sMB_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)内部变量retvalbuf(其大小大于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,储存EILSEQerrno,并留下*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 ++文档

C

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