wcstombs, wcstombs_s
|
Определено в заголовочном файле
<stdlib.h>
|
||
| (1) | ||
| (до C99) | ||
| (начиная с 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) |
src
, в узкое многобайтовое представление, начинающееся в начальном состоянии сдвига. Преобразованные символы сохраняются в последовательных элементах массива char, на который указывает
dst
. Не более чем
len
байт записывается в целевой массив.
len
.
src
и
dst
перекрываются, поведение не определено.
retval
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, где будет сохранен результат |
Возвращаемое значение
dst
. При ошибке преобразования (если встречен недопустимый широкий символ) возвращает
(
size_t
)
-
1
.
dst
, сохраняется в
*
retval
), не ноль при ошибке. В случае нарушения ограничения времени выполнения, сохраняет
(
size_t
)
-
1
в
*
retval
(если только
retval
не является нулевым указателем) и устанавливает
dst
[
0
]
в
'
\0
'
(если только
dst
не является нулевым указателем или
dstmax
не равен нулю или не больше
RSIZE_MAX
)
Пример
#include <stdio.h> #include <stdlib.h> #include <locale.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
Ссылки
- Стандарт 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
|
|