mbsrtowcs, mbsrtowcs_s
From cppreference.net
|
Определено в заголовке
<wchar.h>
|
||
| (1) | ||
|
(начиная с C95)
(до C99) |
||
| (начиная с C99) | ||
| (2) | (начиная с C11) | |
1)
Преобразует нуль-терминированную многобайтовую последовательность символов, начинающуюся в состоянии преобразования, описываемом
*ps
, из массива, на первый элемент которого указывает
*
src
, в её представление широкими символами. Если
dst
не является нулевым указателем, преобразованные символы сохраняются в последовательных элементах массива wchar_t, на который указывает
dst
. Не более чем
len
широких символов записывается в целевой массив. Каждый многобайтовый символ преобразуется как при вызове
mbrtowc
. Преобразование останавливается, если:
-
Многобайтовый нулевой символ был преобразован и сохранён.
*
src
устанавливается в значение нулевого указателя, а
*psпредставляет начальное состояние сдвига. - Встретился недопустимый многобайтовый символ (в соответствии с текущей локалью C). * src устанавливается на начало первого непреобразованного многобайтового символа.
-
Следующий сохраняемый широкий символ превысит
len. * src устанавливается на начало первого непреобразованного многобайтового символа. Это условие не проверяется, еслиdstявляется нулевым указателем.
2)
Аналогично
(1)
, за исключением того, что
-
функция возвращает свой результат через выходной параметр
retval -
если нулевой символ не был записан в
dstпосле записиlenшироких символов, то L ' \0 ' сохраняется вdst[len], что означает запись len+1 всего широких символов -
функция затирает массив назначения от завершающего нуля и до
dstsz -
Если
srcиdstперекрываются, поведение не определено. - следующие ошибки обнаруживаются во время выполнения и вызывают текущую установленную функцию обработки ограничений :
-
-
retval,ps,src, или * src является нулевым указателем -
dstszилиlenбольше чем RSIZE_MAX/sizeof(wchar_t) (еслиdstне является нулевым) -
dstszне равен нулю (еслиdstне является нулевым) -
В первых
dstszмногобайтовых символах массива * src отсутствует нулевой символ иlenбольше чемdstsz(еслиdstне является нулевым)
-
-
Как и все функции с проверкой границ,
mbsrtowcs_sгарантированно доступна только если __STDC_LIB_EXT1__ определено реализацией и если пользователь определяет __STDC_WANT_LIB_EXT1__ как целочисленную константу 1 перед включением <wchar.h> .
Содержание |
Параметры
| dst | - | указатель на массив широких символов, в который будут сохранены результаты |
| src | - | указатель на указатель на первый элемент многобайтовой строки с нулевым завершением |
| len | - | количество широких символов, доступных в массиве, на который указывает dst |
| ps | - | указатель на объект состояния преобразования |
| dstsz | - |
максимальное количество широких символов, которое будет записано (размер
dst
массива)
|
| retval | - | указатель на объект size_t, в который будет сохранен результат |
Возвращаемое значение
1)
При успешном выполнении возвращает количество широких символов, исключая завершающий
L
'
\0
'
, записанных в массив символов. Если
dst
является нулевым указателем, возвращает количество широких символов, которое было бы записано при неограниченной длине. При ошибке преобразования (если встречен недопустимый многобайтовый символ) возвращает
(
size_t
)
-
1
, сохраняет
EILSEQ
в
errno
и оставляет
*
ps
в неопределённом состоянии.
2)
ноль при успехе (в этом случае количество широких символов, исключая завершающий ноль, которые были или могли быть записаны в
dst
, сохраняется в
*
retval
), не ноль при ошибке. В случае нарушения ограничения времени выполнения, сохраняет
(
size_t
)
-
1
в
*
retval
(если
retval
не является нулевым указателем) и устанавливает
dst
[
0
]
в
L
'
\0
'
(если
dst
не является нулевым указателем или
dstmax
не равен нулю или не больше
RSIZE_MAX
)
Пример
Запустить этот код
#include <stdio.h> #include <locale.h> #include <wchar.h> #include <string.h> void print_as_wide(const char* mbstr) { mbstate_t state; memset(&state, 0, sizeof state); size_t len = 1 + mbsrtowcs(NULL, &mbstr, 0, &state); wchar_t wstr[len]; mbsrtowcs(&wstr[0], &mbstr, len, &state); wprintf(L"Wide string: %ls \n", wstr); wprintf(L"The length, including L'\\0': %zu\n", len); } int main(void) { setlocale(LC_ALL, "en_US.utf8"); print_as_wide(u8"z\u00df\u6c34\U0001f34c"); // u8"zß水🍌" }
Вывод:
Wide string: zß水🍌 The length, including L'\0': 5
Ссылки
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 7.29.6.4.1 Функция mbsrtowcs (стр. 445)
-
- K.3.9.3.2.1 Функция mbsrtowcs_s (стр. 648-649)
- Стандарт C99 (ISO/IEC 9899:1999):
-
- 7.24.6.4.1 Функция mbsrtowcs (стр. 391)
Смотрите также
|
(C11)
|
преобразует строку многобайтовых символов в широкую строку
(функция) |
|
(C95)
|
преобразует следующий многобайтовый символ в широкий символ с учётом состояния
(функция) |
|
(C95)
(C11)
|
преобразует широкую строку в строку многобайтовых символов с учётом состояния
(функция) |
|
Документация C++
для
mbsrtowcs
|
|