Defined in header <stdlib.h> | ||
---|---|---|
int wctomb( char *s, wchar_t wc ); | (1) | |
errno_t wctomb_s( int *restrict status, char *restrict s, rsize_t ssz, wchar_t wc ); | (2) | (since C11) |
wc
to multibyte encoding and stores it (including any shift sequences) in the char array whose first element is pointed to by s
. No more than MB_CUR_MAX
characters are stored. The conversion is affected by the current locale's LC_CTYPE category. wc
is the null character, the null byte is written to s
, preceded by any shift sequences necessary to restore the initial shift state.s
is a null pointer, this function resets the global conversion state and determines whether shift sequences are used.status
and the following errors are detected at runtime and call the currently installed constraint handler function: ssz
is less than the number of bytes that would be written (unless s
is null) ssz
is greater than RSIZE_MAX
(unless s
is null) s
is a null pointer but ssz
is not zero wctomb_s
is only guaranteed to be available if __STDC_LIB_EXT1__
is defined by the implementation and if the user defines __STDC_WANT_LIB_EXT1__
to the integer constant 1
before including <stdlib.h>
.Each call to wctomb
updates the internal global conversion state (a static object of type mbstate_t
, known only to this function). If the multibyte encoding uses shift states, this function is not reentrant. In any case, multiple threads should not call wctomb
without synchronization: wcrtomb
or wctomb_s
may be used instead.
Unlike most bounds-checked functions, wctomb_s
does not null-terminate its output, because it is designed to be used in loops that process strings character-by-character.
s | - | pointer to the character array for output |
wc | - | wide character to convert |
ssz | - | maximum number of bytes to write to s (size of the array s ) |
status | - | pointer to an out-parameter where the result (length of the multibyte sequence or the shift sequence status) will be stored |
s
is not a null pointer, returns the number of bytes that are contained in the multibyte representation of wc
or -1
if wc
is not a valid character.s
is a null pointer, resets its internal conversion state to represent the initial shift state and returns 0
if the current multibyte encoding is not state-dependent (does not use shift sequences) or a non-zero value if the current multibyte encoding is state-dependent (uses shift sequences).wc
is stored in s
and its length is stored in *status
, or, if s
is null, the shift sequence status is stored in status
). Non-zero on encoding error or runtime constraint violation, in which case (size_t)-1
is stored in *status
. The value stored in *status
never exceeds MB_CUR_MAX
#include <stdio.h> #include <stdlib.h> #include <locale.h> void demo(wchar_t wc) { const char* dep = wctomb(NULL, wc) ? "Yes" : "No"; printf("State-dependent encoding? %s.\n", dep); char mb[MB_CUR_MAX]; int len = wctomb(mb, wc); printf("wide char '%lc' -> multibyte char [", wc); for (int idx = 0; idx < len; ++idx) printf("%s%#2x", idx ? " " : "", (unsigned char)mb[idx]); printf("]\n"); } int main(void) { setlocale(LC_ALL, "en_US.utf8"); printf("MB_CUR_MAX = %zu\n", MB_CUR_MAX); demo(L'A'); demo(L'\u00df'); demo(L'\U0001d10b'); }
Possible output:
MB_CUR_MAX = 6 State-dependent encoding? No. wide char 'A' -> multibyte char [0x41] State-dependent encoding? No. wide char 'ß' -> multibyte char [0xc3 0x9f] State-dependent encoding? No. wide char '𝄋' -> multibyte char [0xf0 0x9d 0x84 0x8b]
converts the next multibyte character to wide character (function) |
|
(C95)(C11) | converts a wide character to its multibyte representation, given state (function) |
C++ documentation for wctomb |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/string/multibyte/wctomb