wcsncat, wcsncat_s
Из ru.cppreference.net
| Определено в заголовке <wchar.h>
|
||
wchar_t* wcsncat( wchar_t* dest, const wchar_t* src, size_t count );
|
(1) | (начиная с C95) (до C99) |
wchar_t* wcsncat( wchar_t* restrict dest,
const wchar_t* restrict src, size_t count );
|
(начиная с C99) | |
errno_t wcsncat_s( wchar_t* restrict dest, rsize_t destsz,
const wchar_t* restrict src, rsize_t count );
|
(2) | (начиная с C11) |
1) Добавляет не более
count широких символов из широкой строки, на которую указывает src, останавливаясь при копировании нулевого терминатора, в конец строки символов, на которую указывает dest. Широкий символ src[0] заменяет нулевой терминатор в конце dest. Нулевой терминатор всегда добавляется в конце (поэтому максимальное количество широких символов, которое может записать функция, равно count + 1). Поведение не определено, если массив назначения недостаточно велик для содержимого как
src, так и dest и завершающего нулевого широкого символа. Поведение не определено, если строки перекрываются.
2) То же, что и (1), за исключением того, что эта функция может затереть остаток массива назначения (от последнего записанного широкого символа до
destsz) и что следующие ошибки обнаруживаются во время выполнения и вызывают установленную в настоящее время функцию обработчика ограничений:
srcилиdestявляется нулевым указателемdestszилиcountравно нулю или больше чемRSIZE_MAX / sizeof(wchar_t)- нет нулевого широкого символа в первых
destszшироких символахdest - произойдет усечение:
countили длинаsrc, какое из них меньше, превышает пространство, доступное между нулевым терминаторомdestиdestsz. - произойдет перекрытие между исходной и целевой строками
Как и все функции с проверкой границ,
wcsncat_s гарантированно доступна только если __STDC_LIB_EXT1__ определено реализацией и пользователь определяет __STDC_WANT_LIB_EXT1__ как целочисленную константу 1 перед включением <wchar.h>.Параметры
| dest | - | указатель на нуль-терминированную широкую строку, к которой нужно дописать |
| src | - | указатель на нуль-терминированную широкую строку, из которой копировать |
| count | - | максимальное количество широких символов для копирования |
| destsz | - | размер буфера назначения |
Возвращаемое значение
1) возвращает копию
dest2) возвращает ноль при успехе, возвращает ненулевое значение при ошибке. Также при ошибке записывает
L'\0' в dest[0] (если только dest не является нулевым указателем или destsz не равно нулю или больше чем RSIZE_MAX / sizeof(wchar_t)).Примечания
Хотя усечение для соответствия буферу назначения представляет угрозу безопасности и поэтому является нарушением ограничений времени выполнения для wcsncat_s, можно добиться поведения усечения, указав count равным размеру массива назначения минус один: будет скопировано первые count широких символов и добавлен нулевой терминатор, как обычно:
size_t count = sizeof dst / sizeof *dst;
wcsncat_s(dst, count, src, count - wcsnlen_s(dst, count) - 1);
Пример
Запустить этот код
#include <locale.h>
#include <stdio.h>
#include <wchar.h>
int main(void)
{
wchar_t str[50] = L"Земля, прощай.";
wcsncat(str, L" ", 1);
wcsncat(str, L"В добрый путь.", 8); // only append the first 8 wide chars
setlocale(LC_ALL, "en_US.utf8");
printf("%ls", str);
}
Возможный вывод:
Земля, прощай. В добрый
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
- 7.31.4.3.2 Функция wcsncat (стр. 439)
- K.3.9.3.2.2 Функция wcsncat_s (стр. 666)
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.29.4.3.2 Функция wcsncat (стр. 315)
- K.3.9.2.2.2 Функция wcsncat_s (стр. 466-467)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.29.4.3.2 Функция wcsncat (стр. 432-433)
- K.3.9.2.2.2 Функция wcsncat_s (стр. 643-644)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.24.4.3.2 Функция wcsncat (стр. 378-379)
См. также
(C95)(C11) |
добавляет копию одной широкой строки к другой (функция) |
(C11) |
конкатенирует определенное количество символов двух строк (функция) |
(C95)(C11) |
копирует одну широкую строку в другую (функция) |
Документация C++ для wcsncat
| |