Xi Xu's More Things

wcsncat, wcsncat_s

来自cppreference.com
< c‎ | string‎ | wide
 
 
 
空终止宽字符串
函数
字符操作
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C99)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
转换成数值格式
(C95)(C99)
(C95)(C99)
(C99)(C95)(C99)
(C99)(C99)
字符串操作
(C95)(C11)
(C95)(C11)
(C95)(C11)
(C95)(C11)
wcsncatwcsncat_s
(C95)(C11)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)(C11)
数组操作
(C95)(C11)
(C95)(C11)
(C95)
(C95)
(C95)
 
在标头 <wchar.h> 定义
(1)
wchar_t *wcsncat( wchar_t *dest, const wchar_t *src, size_t count );
(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) 后附来自 src 所指向的宽字符串的至多 count 个宽字符,到 dest 所指向的字符串末尾,若找到空字符则停止。宽字符 src[0] 替换位于 dest 末尾的空终止符。始终后附终止空字符到末尾(故函数可写入的最大宽字符数是 count+1 )。
若目标数组没有对于 destsrc 的内容加上终止空宽字符足够的空间,则行为未定义。
若字符串重叠则行为未定义。
2)(1) ,除了此函数可以可用未指定值破坏目标数组的剩余部分(从最后写入宽字符到 destsz ),以及在运行时检测下列错误,并调用当前安装的约束处理函数:
  • srcdest 为空指针
  • destszcount 为零或大于 RSIZE_MAX/sizeof(wchar_t)
  • dest 的首 destsz 个宽字符中无空宽字符
  • 会出现截断: countsrc 长度的较小者,会超出 dest 的空终止符和 destsz 之间的可用空间。
  • 源与目标字符串之间会出现重叠
同所有边界检查函数, wcsncat_s 仅若实现定义了 __STDC_LIB_EXT1__ ,且用户在包含 wchar.h 前定义 __STDC_WANT_LIB_EXT1__ 为整数常量 1 才保证可用。

参数

dest - 指向要后附到的空终止宽字符串的指针
src - 指向作为复制来源的宽字符数组的指针
count - 要复制的最大宽字符数
destsz - 目标缓冲区的大小

返回值

1) 返回 dest 的副本。
2) 成功时返回零。错误时返回非零。错误时,亦写入 L'\0'dest[0] (除非 dest 为空指针,或 destsz 为零或大于 RSIZE_MAX/sizeof(wchar_t) )。

注意

尽管截断以适应目标缓冲区是安全风险,从而是 wcsncat_s 的运行时制约违规,还是可以通过指定 count 等于目标数组大小减一获取截断行为:这将一如往常地复制首 count 个宽字符并后附空终止符: wcsncat_s(dst, sizeof dst/sizeof *dst, src, (sizeof dst/sizeof *dst)-wcsnlen_s(dst, sizeof dst/sizeof *dst)-1);

示例

#include <wchar.h> 
#include <stdio.h>
#include <locale.h>
 
int main(void) 
{
    wchar_t str[50] = L"Земля, прощай.";
    wcsncat(str, L" ", 1);
    wcsncat(str, L"В добрый путь.", 8); // 只后附首 8 个宽字符
    setlocale(LC_ALL, "en_US.utf8");
    printf("%ls", str);
}

可能的输出:

Земля, прощай. В добрый

引用

  • C11 标准(ISO/IEC 9899:2011):
  • 7.29.4.3.2 The wcsncat function (第 432-433 页)
  • K.3.9.2.2.2 The wcsncat_s function (第 643-644 页)
  • C99 标准(ISO/IEC 9899:1999):
  • 7.24.4.3.2 The wcsncat function (第 378-379 页)

参阅

(C95)(C11)
将一个宽字符串的副本后附于另一个
(函数)
连接两个字符串的一定数量字符
(函数)
(C95)(C11)
将一个宽字符串复制给另一个
(函数)