wcstombs, wcstombs_s
Определено в заголовочном файле <stdlib.h> | ||
|---|---|---|
size_t wcstombs( char* dst, const wchar_t* src, size_t len ); | (1) | (до C99) |
size_t wcstombs( char* restrict dst, const wchar_t* restrict src, size_t len ); | (начиная с C99) | |
errno_t wcstombs_s( size_t* restrict retval, char* restrict dst, rsize_t dstsz,
const wchar_t* restrict src, rsize_t len );
| (2) | (начиная с C11) |
1) Преобразует последовательность широких символов из массива, первый элемент которого указан
Каждый символ преобразуется так, как если бы был вызван src, в соответствующее узкое многобайтовое представление, начинающееся в исходном состоянии сдвига. Преобразованные символы сохраняются в последовательных элементах массива char, на который указывает dst. В массив назначения записывается не более len байт.wctomb, за исключением того, что состояние преобразования wctomb не изменяется. Преобразование прекращается, если: - Нулевой символ
L'\0'был преобразован и сохранён. В этом случае записанные байты представляют собой последовательность сброса (если она необходима), за которой следует'\0', - Обнаружен wchar_t, не соответствующий допустимому символу в текущей локали C.
- Следующий многобайтовый символ, который нужно сохранить, превысит
len.
Если
2) То же, что и (1), за исключением того, что src и dst перекрываются, поведение не определено.- преобразование выполняется так, как если бы была вызвана
wcrtomb, а неwctomb - функция возвращает результат через выходной параметр
retval - если преобразование прекращается без записи нулевого символа, функция сохранит
'\0'в следующем байте вdst, которым может бытьdst[len]илиdst[dstsz]— в зависимости от того, что наступит раньше (то есть всего может быть записано до len+1/dstsz+1 байт). В этом случае перед завершающим нулевым символом может не записываться последовательность сброса. - если
dst— нулевой указатель, количество байтов, которые были бы созданы, сохраняется в*retval - функция затирает содержимое массива назначения от завершающего нулевого символа до
dstsz - Если
srcиdstперекрываются, поведение не определено. - во время выполнения обнаруживаются следующие ошибки, при возникновении которых вызывается установленная в данный момент функция обработчика ограничений:
-
retvalилиsrcявляется нулевым указателем -
dstszилиlenбольшеRSIZE_MAX(если толькоdstне является нулевым указателем) -
dstszне равно нулю (если толькоdstне является нулевым указателем) -
lenбольшеdstsz, и преобразование не встречает нулевой символ или ошибку кодирования в массивеsrcк моменту достиженияdstsz(если толькоdstне является нулевым указателем)
wcstombs_s гарантируется только в том случае, если реализация определяет __STDC_LIB_EXT1__, а пользователь определяет __STDC_WANT_LIB_EXT1__ целочисленной константой 1 до включения <stdlib.h>. Примечания
В большинстве реализаций wcstombs обновляет глобальный статический объект типа mbstate_t при обработке строки, поэтому её нельзя одновременно вызывать из двух потоков. В таких случаях следует использовать wcsrtombs или wcstombs_s.
POSIX определяет распространённое расширение: если dst — нулевой указатель, эта функция возвращает количество байтов, которые были бы записаны в dst при преобразовании. Аналогичное поведение стандартизовано для wcsrtombs и wcstombs_s.
Параметры
| dst | - | указатель на массив узких символов, в который будет сохранён многобайтовый символ |
| src | - | указатель на первый элемент завершаемой нулевым символом строки широких символов, которую нужно преобразовать |
| len | - | количество байтов, доступных в массиве, на который указывает dst |
| dstsz | - | максимальное количество байтов, которое будет записано (размер массива dst) |
| retval | - | указатель на объект size_t, в который будет сохранён результат |
Возвращаемое значение
1) В случае успеха возвращает количество байтов (включая последовательности сдвига, но не включая завершающий
'\0'), записанных в массив символов, первый элемент которого указан dst. При ошибке преобразования (если обнаружен недопустимый широкий символ) возвращает (size_t)-1.
2) В случае успеха возвращает ноль (при этом количество байтов без завершающего нулевого символа, которые были или могли бы быть записаны в
dst, сохраняется в *retval), при ошибке возвращает ненулевое значение. При нарушении ограничения времени выполнения сохраняет (size_t)-1 в *retval (если только retval не является нулевым указателем) и устанавливает dst[0] в '\0' (если только dst не является нулевым указателем, а dstmax не равно нулю или не превышает RSIZE_MAX)Пример
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
// 4 wide characters
const wchar_t src[] = L"z\u00df\u6c34\U0001f34c";
// they occupy 10 bytes in UTF-8
char dst[11];
setlocale(LC_ALL, "en_US.utf8");
printf("wide-character string: '%ls'\n",src);
for (size_t ndx = 0; ndx < sizeof src / sizeof src[0]; ++ndx)
printf(" src[%2zu] = %#8x\n", ndx, src[ndx]);
int rtn_val = wcstombs(dst, src, sizeof dst);
printf("rtn_val = %d\n", rtn_val);
if (rtn_val > 0)
printf("multibyte string: '%s'\n",dst);
for (size_t ndx = 0; ndx < sizeof dst; ++ndx)
printf(" dst[%2zu] = %#2x\n", ndx, (unsigned char)dst[ndx]);
}
Вывод:
wide-character string: 'zß水🍌' src[ 0] = 0x7a src[ 1] = 0xdf src[ 2] = 0x6c34 src[ 3] = 0x1f34c src[ 4] = 0 rtn_val = 10 multibyte string: 'zß水🍌' dst[ 0] = 0x7a dst[ 1] = 0xc3 dst[ 2] = 0x9f dst[ 3] = 0xe6 dst[ 4] = 0xb0 dst[ 5] = 0xb4 dst[ 6] = 0xf0 dst[ 7] = 0x9f dst[ 8] = 0x8d dst[ 9] = 0x8c dst[10] = 0
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
- 7.22.8.2 Функция wcstombs (стр.: TBD)
- K.3.6.5.2 Функция wcstombs_s (стр.: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.22.8.2 Функция wcstombs (стр.: TBD)
- K.3.6.5.2 Функция wcstombs_s (стр.: TBD)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.22.8.2 Функция wcstombs (стр.: 360)
- K.3.6.5.2 Функция wcstombs_s (стр.: 612-614)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.20.8.2 Функция wcstombs (стр.: 324)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
- 4.10.8.2 Функция wcstombs
См. также
|
(C95)(C11) | преобразует широкую строку в строку узких многобайтовых символов с заданным состоянием (функция) |
|
(C11) | преобразует строку узких многобайтовых символов в широкую строку (функция) |
Документация C++ для wcstombs |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/string/multibyte/wcstombs