Namespaces
Variants

mbsrtowcs, mbsrtowcs_s

From cppreference.net
Определено в заголовке <wchar.h>
(1)
size_t mbsrtowcs ( wchar_t * dst, const char ** src, size_t len, mbstate_t * ps ) ;
(начиная с C95)
(до C99)
size_t mbsrtowcs ( wchar_t * restrict dst, const char ** restrict src, size_t len,
mbstate_t * restrict ps ) ;
(начиная с C99)
errno_t mbsrtowcs_s ( size_t * restrict retval,

wchar_t * restrict dst, rsize_t dstsz,
const char ** restrict src, rsize_t len,

mbstate_t * restrict ps ) ;
(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)

Смотрите также

преобразует строку многобайтовых символов в широкую строку
(функция)
(C95)
преобразует следующий многобайтовый символ в широкий символ с учётом состояния
(функция)
преобразует широкую строку в строку многобайтовых символов с учётом состояния
(функция)