wcsrtombs, wcsrtombs_s
Определено в заголовке <wchar.h> |
||
|---|---|---|
| (1) | ||
size_t wcsrtombs( char *dst, const wchar_t **src, size_t len, mbstate_t* ps ); |
(с C95) (до C99) |
|
size_t wcsrtombs( char *restrict dst, const wchar_t **restrict src, size_t len,
mbstate_t *restrict ps );
|
(с C99) | |
errno_t wcsrtombs_s( size_t *restrict retval, char *restrict dst, rsize_t dstsz,
const wchar_t **restrict src, rsize_t len,
mbstate_t *restrict ps );
|
(2) | (с C11) |
*src, в его многобайтовое узкое представление, начиная с состояния преобразования, описанного в *ps. Если dst не равно нулю, преобразованные символы хранятся в последовательных элементах массива символов char, на который указывает dst. В массив назначения записывается не более len байтов. Каждый символ преобразуется так, как будто вызывается wcrtomb. Преобразование останавливается, если:
- был преобразован и сохранён нулевой символ
L'\0'. Записанные в этом случае байты представляют собой последовательность сброса (если необходимо) и за ней следует'\0',*srcустанавливается в значение нулевого указателя, а*psпредставляет собой начальное состояние сдвига. - был найден
wchar_t, который не соответствует допустимому символу в текущем локали C.*srcустанавливается в указатель на первый не преобразованный широкий символ. - следующий многобайтовый символ для записи превысил бы
len.*srcустанавливается в указатель на первый не преобразованный широкий символ. Это условие не проверяется, еслиdstявляется нулевым указателем.
- функция возвращает свой результат как параметр вывода
retval - если преобразование останавливается без записи нулевого символа, функция запишет
'\0'в следующий байт вdst, что может бытьdst[len]илиdst[dstsz], в зависимости от того, что появится первым (что означает, что в общей сложности может быть записано до len+1/dstsz+1 байтов). В этом случае может не быть записано никакой последовательности сброса перед завершающим нулём. - функция очищает массив назначения от завершающего нуля и до
dstsz - Если
srcиdstперекрываются, поведение не определено. - следующие ошибки обнаруживаются во время выполнения и вызывают установленную в настоящее время функцию обработчика ограничений обработчик ограничений:
-
-
retval,ps,src, или*srcявляется нулевым указателем -
dstszилиlenбольше, чемRSIZE_MAX(еслиdstне равен нулю) -
dstszне равно нулю (еслиdstне равен нулю) -
lenбольше, чемdstszи преобразование не встречает нуль или ошибку кодирования в массивеsrcк моменту, когда достигаетсяdstsz(еслиdstне равен нулю)
-
- Как и во всех функциях с проверкой границ,
wcsrtombs_sгарантировано доступна только если__STDC_LIB_EXT1__определено реализацией и если пользователь определяет__STDC_WANT_LIB_EXT1__как целую константу1перед включением<wchar.h>.
Параметры
| dst | - | указатель на массив узких символов, куда будут записаны многобайтовые символы |
| src | - | указатель на указатель на первый элемент нуль-терминированной широкой строки |
| len | - | количество байтов, доступных в массиве, на который указывает dst |
| ps | - | указатель на объект состояния преобразования |
| dstsz | - | максимальное количество байтов, которые будут записаны (размер массива dst) |
| retval | - | указатель на объект size_t, куда будет записан результат |
Возвращаемое значение
1) При успехе возвращает количество байтов (включая любые последовательности сдвига, но исключая завершающий
'\0'), записанных в массив символов, адрес первого элемента которого указан в dst. Если dst является нулевым указателем, возвращает количество байтов, которые были бы записаны. При ошибке преобразования (если был встречен недопустимый широкий символ) возвращает (size_t)-1, записывает EILSEQ в errno и оставляет *ps в неопределённом состоянии.
2) Возвращает ноль при успехе (в этом случае количество байтов, исключая завершающий ноль, которое было или будет записано в
dst, сохраняется в *retval), ненулевое значение при ошибке. В случае нарушения ограничения во время выполнения записывает (size_t)-1 в *retval (если retval не равен нулю) и устанавливает dst[0] в '\0' (если dst не равен нулю или dstmax равно нулю или больше RSIZE_MAX). Пример
#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <wchar.h>
void print_wide(const wchar_t* wstr)
{
mbstate_t state;
memset(&state, 0, sizeof state);
size_t len = 1 + wcsrtombs(NULL, &wstr, 0, &state);
char mbstr[len];
wcsrtombs(mbstr, &wstr, len, &state);
printf("Multibyte string: %s\n", mbstr);
printf("Length, including '\\0': %zu\n", len);
}
int main(void)
{
setlocale(LC_ALL, "en_US.utf8");
print_wide(L"z\u00df\u6c34\U0001f34c"); // or L"zß水🍌"
}Вывод:
Multibyte string: zß水🍌 Length, including '\0': 11
Ссылки
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.29.6.4.2 Функция wcsrtombs (с. 324-325)
- K.3.9.3.2.2 Функция wcsrtombs_s (с. 471-472)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.29.6.4.2 Функция wcsrtombs (с. 446)
- K.3.9.3.2.2 Функция wcsrtombs_s (с. 649-651)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.24.6.4.2 Функция wcsrtombs (с. 392)
См. также
|
(C11) |
преобразует широкую строку в узкую многобайтовую строку символов (функция) |
|
(C95)(C11) |
преобразует широкий символ в его многобайтовое представление, учитывая состояние (функция) |
|
(C95)(C11) |
преобразует узкую многобайтовую строку символов в широкую строку, учитывая состояние (функция) |
Документация C++ для wcsrtombs |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/string/multibyte/wcsrtombs