wcsrtombs, wcsrtombs_s
From cppreference.net
|
Определено в заголовке
<wchar.h>
|
||
| (1) | ||
|
(начиная с C95)
(до C99) |
||
| (начиная с C99) | ||
| (2) | (начиная с C11) | |
1)
Преобразует последовательность широких символов из массива, на первый элемент которого указывает
*
src
, в её узкое многобайтовое представление, начинающееся в состоянии преобразования, описанном
*
ps
. Если
dst
не является нулевым указателем, преобразованные символы сохраняются в последовательных элементах массива char, на который указывает
dst
. Не более чем
len
байт записывается в целевой массив. Каждый символ преобразуется как при вызове
wcrtomb
. Преобразование останавливается, если:
- Символ нуля L ' \0 ' был преобразован и сохранён. В этом случае сохраняются байты последовательности сброса (если необходимо), за которыми следует ' \0 ' , * src устанавливается в значение нулевого указателя, а * ps представляет начальное состояние сдвига.
- Найден wchar_t , который не соответствует допустимому символу в текущей локали C. * src устанавливается на первый непреобразованный широкий символ.
-
Следующий сохраняемый многобайтовый символ превысит
len. * src устанавливается на первый непреобразованный широкий символ. Это условие не проверяется, еслиdstявляется нулевым указателем.
2)
Аналогично
(1)
, за исключением того, что
-
функция возвращает свой результат через выходной параметр
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++ documentation
для
wcsrtombs
|
|