Namespaces
Variants

wcsncpy, wcsncpy_s

С ru.cppreference.net
 
 
 
 
Определён в заголовке <wchar.h>
wchar_t* wcsncpy( wchar_t* dest, const wchar_t* src, size_t count );
(1) (начиная с C95)
(до C99)
wchar_t* wcsncpy( wchar_t* restrict dest, const wchar_t* restrict src, size_t count );
(начиная с C99)
errno_t wcsncpy_s( wchar_t* restrict dest, rsize_t destsz,
                   const wchar_t* restrict src, rsize_t count);
(2) (начиная с C11)
1) Копирует не более count символов широкой строки, на которую указывает src (включая завершающий нулевой широкий символ), в массив широких символов, на который указывает dest.
Если count достигнуто до того, как вся строка src была скопирована, результирующий массив широких символов не завершается нулём.
Если после копирования завершающего нулевого широкого символа из src не достигнуто count, дополнительные нулевые широкие символы записываются в dest до тех пор, пока не будет записано всего count символов.
Если строки перекрываются, поведение не определено.
2) То же, что и (1), за исключением того, что функция не продолжает записывать нули в целевой массив для дополнения до count, а останавливается после записи завершающего нулевого символа (если в источнике не было нуля, она записывает его в dest[count] и затем останавливается). Кроме того, следующие ошибки обнаруживаются во время выполнения и вызывают текущую установленную функцию обработчик ограничений:
  • src или dest является нулевым указателем
  • destsz или count равно нулю или больше, чем RSIZE_MAX / sizeof(wchar_t)
  • count больше или равно destsz, но destsz меньше или равно wcsnlen_s(src, count), иными словами, произошло бы усечение
  • произошло бы перекрытие между исходной и целевой строками
Как и все функции с проверкой границ, wcsncpy_s гарантированно доступна только в том случае, если __STDC_LIB_EXT1__ определена реализацией и если пользователь определяет __STDC_WANT_LIB_EXT1__ как целочисленную константу 1 перед включением <wchar.h>.

Параметры

dest — указатель на массив широких символов, в который производится копирование
src — указатель на широкую строку, из которой производится копирование
count — максимальное количество широких символов для копирования
destsz — размер целевого буфера

Возвращаемое значение

1) возвращает копию dest
2) возвращает ноль в случае успеха, возвращает ненулевое значение в случае ошибки. Также в случае ошибки записывает L'\0' в dest[0] (если только dest не является нулевым указателем или destsz не равно нулю или больше RSIZE_MAX / sizeof(wchar_t)) и может испортить остальную часть целевого массива неопределёнными значениями.

Примечания

При типичном использовании count — это количество элементов в целевом массиве.

Хотя усечение для помещения в целевой буфер представляет угрозу безопасности и, следовательно, является нарушением ограничений времени выполнения для wcsncpy_s, можно получить поведение усечения, указав count равным размеру целевого массива минус один: при этом будут скопированы первые count широких символов и добавлен завершающий нулевой широкий символ, как обычно:

size_t count = sizeof dst / sizeof *dst;
wcsncpy_s(dst, count, src, count - 1);

Пример

#include <locale.h>
#include <stdio.h>
#include <wchar.h>
 
int main(void)
{
    const wchar_t src[] = L"わゐ";
    wchar_t dest[6] = {L'あ', L'い', L'う', L'え', L'お'};
 
    wcsncpy(dest, src, 4); // this will copy わゐ and repeat L'\0' two times
 
    puts("The contents of dest are: ");
    setlocale(LC_ALL, "en_US.utf8");

    const long dest_size = sizeof dest / sizeof *dest;
    for(wchar_t* p = dest; p - dest != dest_size; ++p) {
        *p ? printf("%lc ", *p)
           : printf("\\0 ");
    }
}

Возможный вывод:

The contents of dest are:
わ ゐ \0 \0 お \0

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • 7.31.4.2.2 Функция wcsncpy (стр. 438)
  • K.3.9.3.1.2 Функция wcsncpy_s (стр. 663-664)
  • Стандарт C17 (ISO/IEC 9899:2018):
  • 7.29.4.2.2 Функция wcsncpy (стр. 314)
  • K.3.9.2.1.2 Функция wcsncpy_s (стр. 464)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.29.4.2.2 Функция wcsncpy (стр. 431)
  • K.3.9.2.1.2 Функция wcsncpy_s (стр. 640-641)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 7.24.4.2.2 Функция wcsncpy (стр. 377)

См. также

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