strncpy_s

在头文件中定义

(1)

char * strncpy(char * dest,const char * src,size_t count);

(直到C99)

char * strncpy(char * restrict dest,const char * restrict src,size_t count);

(自C99以来)

errno_t strncpy_s(char * restrict dest,rsize_t destsz,const char * restrict src,rsize_t count);

(2)

(自C11以来)

1)将由src指向的字符数组的大部分计数字符(包括终止空字符,但不包括空字符后面的任何字符)复制到由dest指向的字符数组。

如果在复制完整个数组src之前达到count,则生成的字符数组不会以null结尾。

如果在复制src中的终止空字符之后,未达到count,则将额外的空字符写入dest,直到写入总计数字符。

如果字符数组重叠,如果dest或src不是指向字符数组的指针(包括如果dest或src是空指针),如果dest指向的数组大小小于count,则行为未定义, 或者如果src指向的数组大小小于count并且不包含空字符。

2)与(1)相同,除了该函数不会继续将零写入目标数组以填充计数,它将在写入终止空字符后停止(如果源中没有空值,它将在dest处写入一个 [count]然后停止)。 此外,在运行时检测到以下错误并调用当前安装的约束处理函数:

src或者dest是空指针

destsz或者count是零或大于RSIZE_MAX

count大于或等于destsz,但destsz小于或等于strnlen_s(src, count),换句话说,会发生截断

源和目标字符串之间会发生重叠

如果dest

作为所有边界检查函数,只有当__STDC_LIB_EXT1__由实现定义并且用户在包含string.h之前将__STDC_WANT_LIB_EXT1__定义为整数常量1时,strncpy_s才能保证可用。

参数

dest

-

指向要复制到的字符数组的指针

SRC

-

指向要复制的字符数组的指针

count

-

最大数量的字符复制

destsz

-

目标缓冲区的大小

返回值

1)返回 dest 副本

2)在成功时返回零,错误时返回非零值。 另外,如果出错,则将0写入dest [0](除非dest为空指针或destsz为零或大于RSIZE_MAX),并可能用未指定的值来摧毁目标数组的其余部分。

注意

正如后C11 DR 468所纠正的那样,strncpy_s与strcpy_s不同,只有在发生错误时才允许对目标数组的其余部分进行截断。

与strncpy不同,strncpy_s不会用零填充目标数组,这是将现有代码转换为边界检查版本时常见的错误来源。

尽管适合目标缓冲区的截断存在安全风险,并因此违反了strncpy_s的运行时间约束,但可以通过指定count等于目标数组的大小减1来获得截断行为:它将复制第一个计数字节和 像往常一样追加空终止符:strncpy_s(dst,sizeof dst,src,(sizeof dst)-1);

#define __STDC_WANT_LIB_EXT1__ 1

#include

#include

#include

int main(void)

{

char src[] = "hi";

char dest[6] = "abcdef"; // no null terminator

strncpy(dest, src, 5); // writes five characters 'h', 'i', '\0', '\0', '\0' to dest

printf("strncpy(dest, src, 5) to a 6-byte dest gives : ");

for(size_t n = 0; n < sizeof dest; ++n) {

char c = dest[n];

c ? printf("'%c' ", c) : printf("'\\0' ");

}

printf("\nstrncpy(dest2, src, 2) to a 2-byte dst gives : ");

char dest2[2];

strncpy(dest2, src, 2); // truncation: writes two characters 'h', 'i', to dest2

for(size_t n = 0; n < sizeof dest2; ++n) {

char c = dest2[n];

c ? printf("'%c' ", c) : printf("'\\0' ");

}

printf("\n");

#ifdef __STDC_LIB_EXT1__

set_constraint_handler_s(ignore_handler_s);

char dst1[6], src1[100] = "hello";

int r1 = strncpy_s(dst1, 6, src1, 100); // writes 0 to r1, 6 characters to dst1

printf("dst1 = \"%s\", r1 = %d\n", dst1,r1); // 'h','e','l','l','o','\0' to dst1

char dst2[5], src2[7] = {'g','o','o','d','b','y','e'};

int r2 = strncpy_s(dst2, 5, src2, 7); // copy overflows the destination array

printf("dst2 = \"%s\", r2 = %d\n", dst2,r2); // writes nonzero to r2,'\0' to dst2[0]

char dst3[5];

int r3 = strncpy_s(dst3, 5, src2, 4); // writes 0 to r3, 5 characters to dst3

printf("dst3 = \"%s\", r3 = %d\n", dst3,r3); // 'g', 'o', 'o', 'd', '\0' to dst3

#endif

}

可能的输出:

strncpy(dest, src, 5) to a 6-byte dst gives : 'h' 'i' '\0' '\0' '\0' 'f'

strncpy(dest2, src, 2) to a 2-byte dst gives : 'h' 'i'

dst1 = "hello", r1 = 0

dst2 = "", r2 = 22

dst3 = "good", r3 = 0

参考

C11标准(ISO / IEC 9899:2011): 7.24.2.4 strncpy函数(p:363-364)

K.3.7.1.4 strncpy_s函数(p:616-617)

C99标准(ISO / IEC 9899:1999): 7.21.2.4 strncpy函数(p:326-327)

C89 / C90标准(ISO / IEC 9899:1990): 4.11.2.4 strncpy函数

扩展内容

strcpystrcpy_s(C11)

将一个字符串复制到另一个(函数)

memcpymemcpy_s(C11)

将一个缓冲区复制到另一个(功能)

strndup (dynamic memory TR)

将字符串的副本分配给指定大小(函数)

| 用于strncpy 的C ++文档|

c语言 字符串 strncpy,strncpy_s相关推荐

  1. c语言 字符串 strncpy,详解c语言中的 strcpy和strncpy字符串函数使用

    详解c语言中的 strcpy和strncpy字符串函数使用 strcpy 和strcnpy函数--字符串复制函数. 1.strcpy函数 函数原型:char *strcpy(char *dst,cha ...

  2. C语言-字符串拷贝(2)strncpy

    C语言-字符串拷贝(2)strncpy 1. strncpy 1 定义: 2 原型: 3 功能: 4 说明: 5 缺点: 6 实现-原始版1 7 实现-原始版2 8. n 的长度大于 strlen(d ...

  3. c语言字符串文库总结,C语言字符串.ppt

    C语言字符串.ppt ACM程序设计,福州大学至诚学院 冯新,第四讲,字符串处理,常用函数介绍,复制,char* strcpy char *s1, const char *s2; 将字符串s2复制到s ...

  4. 字符串操作 c语言,C语言字符串操作(示例代码)

    C语言字符串操作函数 1.strlen strlen用于求一个C风格字符串的长度,函数原型为 #include size_t strlen(const char *s); 返回值为字符串的长度,当遇到 ...

  5. C语言字符串函数大全

    转载自http://www.360doc.com/content/08/0723/22/26860_1462024.shtml# C语言字符串函数大全 函数名: stpcpy 功能: 拷贝一个字符串到 ...

  6. C语言 -- 字符串中根据特定字符(串)分割

    版权 C语言字符串操作函数有很多,这里举出需要用到的,其他请自行查找. 1.len = strlen(p) ://取字符串长度 原型:size_t strlen(const char *s);  功能 ...

  7. C语言——字符串函数

    C语言--字符串函数 宗旨:技术的学习是有限的,分享的精神是无限的. 常用字符串操作函数的实现:注释部分你们注意一下,我没加/,加了/就看不到注释了. ************************ ...

  8. c++ 字符串连接_C语言字符串操作总结大全(超详细)

    本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, ...

  9. C语言字符串函数及如何实现这些函数

    C语言字符串函数及如何实现这些函数 ​ 近期在复习C语言字符串相关的知识,在观看了 翁恺 老师的 C语言程序设计 课程后,打算对C语言标准库以及 string.h 内的函数进行整理,并写出自己的实现方 ...

最新文章

  1. Faster-RCNN+ZF用自己的数据集训练模型(Python版本)
  2. Linux下的Backlight子系统
  3. 【报错笔记】Navicat连接数据库显示2003错误,无法连接到数据库
  4. WinSock学习笔记
  5. (三): 十六进制转化为rgb
  6. linux防火墙没看3306访问不,Linux配置防火墙,开启80端口、3306端口
  7. python导出mysql授权语句
  8. Sinkhorn算法,正矩阵与双随机矩阵之间的关系
  9. Android逆向之静态分析
  10. excel使用教程_【免费】人人入手的办公软件(excel,ppt,word)——安装包/教程/模板合集...
  11. 二次量子化与量子计算化学
  12. 本科生计算机论文中文核心,本科生可以发表核心期刊论文吗
  13. 半小时漫画股票实战法观看记录,观看更新
  14. MySQL数据库相关资料
  15. 自然语言处理从零到入门 BERT
  16. Android层面上对sensor及event事件的处理
  17. (SQL语句)查询条件模糊匹配若干字段
  18. 2020 年百度之星·程序设计大赛 - 初赛一题解
  19. C# Redis使用及帮助类
  20. android 代码 drawable,Android Drawable完全解析(一):Drawable源码分析(中)

热门文章

  1. squeeze()和unsqueeze()
  2. JavaSwing_1.2: GridLayout(网格布局)
  3. 经纬财富:菏泽黄金投资如何止损
  4. 优化设备管理,提升企业效益——工程设备管理模板的实用价值分析
  5. Viewport介绍
  6. 移动端 viewport视口与meta
  7. css 为什么会有缝隙,调整浏览器的显示比例不同,缝隙的位置也不一样,有的比例又没有缝隙,但按照我的宽高计算应该没有缝隙啊
  8. Android页面设计(一)——简洁美观的登录页面
  9. 中国国产高性能民用计算机,2018年中国高性能计算机TOP100排行榜出炉 入围厂商均为国产厂商...
  10. Python快速计算24点游戏并获取表达式