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

  • 1. strncpy
    • 1 定义:
    • 2 原型:
    • 3 功能:
    • 4 说明:
    • 5 缺点:
    • 6 实现-原始版1
    • 7 实现-原始版2
  • 8. n 的长度大于 strlen(dst)
  • 9. 考虑内存重叠的strncpy
  • 10. strncpy 的正确使用方法
  • 参考:

C语言-字符串拷贝(1)strcpy
https://blog.csdn.net/lqy971966/article/details/102675770
C语言-字符串拷贝(2)strncpy
https://blog.csdn.net/lqy971966/article/details/102676298
C语言-字符串拷贝(3)strlcpy
https://blog.csdn.net/lqy971966/article/details/102689950

1. strncpy

1 定义:

strncpy 把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。

2 原型:

char *strncpy(char *dest, char *src, int n);

3 功能:

总的来说,strncpy总是复制 n 个字符到dst指向的内存!
与strcpy一样 没有解决长度大于目标串的长度。

4 说明:

  1. 如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。
  2. 如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。
  3. src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

5 缺点:

  1. src的长度小于len ?
  2. src的长度大于len ?
    《C和指针》p179给出的答案是:
    “和strcpy一样,strncpy把源字符串的字符复制到目标数组。
    然而,它总是正好向dst写入len个字符。
    如果strlen(src)的值小于len,dst数组就用额外的NUL字节填充到len长度;
    如果strlen(src)的值大于或等于len,那么只有len个字符被复制到dst中。”
    注意!它的结果将不会以NUL字节结尾。(NUL即‘\0’).

6 实现-原始版1

char *strncpy(char *dst, const char *src, size_t len)
{  assert(dst != NULL && src != NULL);  char *res = dst;  while (len--)  {  *dst++ = *src++;  }  return res;
}

7 实现-原始版2

处理 src长度小于 n ,后面补充\0

char *strncpy(char *dest, const char *src, size_t n)
{  assert(dest != NULL && src != NULL);  char *res = dest;  int offset = 0;  if (strlen(src) < n)  //src长度小于len  {  offset = n- strlen(src);  n = strlen(src);  }  while (n--)  {  *dest++ = *src++;  }  while (offset--)  {  *dest++ = '\0';  }  return res;

}

8. n 的长度大于 strlen(dst)

使用这个函数(与 strcpy 一样),尤其需要注意,不要出现 n>strlen(dst)的情况,如果 n>strlen(dst),那么会破坏dst后面的内存:

 char message[] = "abcd";  strncpy(message, "abcde",5);  cout << message;

输出是abcde烫烫烫烫烫烫烫烫烫烫烫

原因:
message的内存是有5个字节的,但是将abcde拷贝过去时,最后面的‘\0’被覆盖了,strncpy并不会负责添加‘\0’到dst结尾,因此,输出该字符串是,会在e字符后面一直找到‘\0’才结束,因此就会出现乱码。

9. 考虑内存重叠的strncpy

标准库中的strncpy是不考虑内存重叠的,如果出现内存重叠,结果将是未定义的。
待续。。。

10. strncpy 的正确使用方法

最后,使用strncpy时,最好自动添加‘\0’在结尾
char buffer[BSIZE];
.
.
strncpy(buffer,name,BSIZE);
buffer[BSIZE-1]=‘\0’;

参考:

  1. https://blog.csdn.net/tigerjibo/article/details/6412759
  2. https://blog.csdn.net/xx326664162/article/details/72781528
  3. https://blog.csdn.net/weibo1230123/article/details/80382614

C语言-字符串拷贝(2)strncpy相关推荐

  1. c语言字符串 从后拷贝,C语言字符串拷贝

    C语言字符串拷贝利用指针操作,要清楚知道指针的指向 代码如下: #include #include #include char* my_strcpy1(char* dest, const char* ...

  2. C语言字符串库函数strcpy,strncpy,strcat,strncat,ctrcmp,strncmp的简介与实现

    目录 一.C语言部分字符串库函数的介绍 1.strcpy函数的介绍 2.strncpy函数的介绍 3.strcat函数的介绍 4.strncat函数的介绍 5.strcmp函数的介绍 6.strncm ...

  3. c语言 字符串拷贝函数作用,C语言不使用strcpy函数如何实现字符串复制功能

    Ⅰ )字符串复制函数 字符串复制是字符串操作中比较常用的操作之一.C语言库函数中提供的字符串复制函数是:strcpy函数.该函数的功能为:把源字符数组中的字符串复制到目的字符数组中,字符串结束标志&q ...

  4. 分割字符串c语言strsep,C语言 字符串切割

    #include #include #include /* 字符串切割函数 */ /* 知识补充: 1. 函数原型: char *strtok(char *str, const char *delim ...

  5. c语言字符串提取第二个字符,c语言如何复制字符串(取前n个字符)strncpy()函数的应用实例...

    c语言如何复制字符串(取前n个字符)strncpy()函数的应用实例.函数需引入的头文件:#include 定义strncpy()函数:char * strncpy(char *dest, const ...

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

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

  7. 字符串拷贝函数memcpy()、strncpy()和snprintf()性能之比较

    问题: 函数memcpy(dest, src, sizeof(dest)).strncpy(dest, src, sizeof(dest))和snprintf(dest, sizeof(dest), ...

  8. 函数 —— strncpy() (内存重叠) memcpy() memmove() 一个字符串拷贝给另一个字符串

    char *strncpy(char *dest, const char *src, size_t n) *strncpy(char *dest, const char *src, size_t n) ...

  9. 【C 语言】字符串拷贝 ( 优化指针操作 )

    文章目录 一.优化指针操作 二.优化指针操作 2 三.优化指针操作 3 四.优化指针操作 4 一.优化指针操作 在上一篇博客 [C 语言]字符串拷贝 ( 字符串拷贝业务逻辑代码 | 分离 主函数 与 ...

最新文章

  1. Caused by: java.net.UnknownHostException: localhost.localdomain: localhost.localdomain的问题解决
  2. Waiting for Debugger
  3. java反编译工具_漫话:如何给女朋友解释什么是编译与反编译
  4. Android——监听事件总结
  5. 启明星辰集团DT总部落地杭州 数据绿洲版图驱动未来发展
  6. httpd svn 编译安装_CentOS 6 编译安装Subversion-1.8.10+Apache2.4
  7. 整数的素因子分解:Pollard rho method
  8. 读书日记- 堆排序算法
  9. python点对点传输_python点对点简单实现
  10. 单片机实验(流水灯)(c语言程序),51单片机c语言_单片机流水灯c语言程序_单片机c语言入门...
  11. 鲁棒控制(Ⅰ)—LMI处理方法
  12. 【工具分享】任意坐标系CAD范围线多点配准及准确导入导入LSV
  13. 收藏夹吃灰系列(二):教小师妹通过代码实现Swagger在线接口文档转word文档!教完后...?
  14. VMware安装虚拟机
  15. matplotlib的常用的两种方式以及pylab
  16. OPGL+VS2017+GLFW+GLEW配置详细步骤
  17. 解决Python官网打不开
  18. 三维导航,快速三维立体查看CAD图纸
  19. Adobe Reader 文档无法签名_Linux下的6款最好用的PDF文档阅览工具
  20. 得生态者得天下,亚马逊云科技开启“无边界”合作伙伴模式

热门文章

  1. SteamVR---抓取物体
  2. php socket read 阻塞,PHP socket_read报错问题
  3. 吴恩达《机器学习》笔记汇总
  4. 安卓日记本设计内容介绍_三年级学习写日记,先了解格式、内容和写作方向
  5. 使用Python开发DeFi项目
  6. 【学习记录】激光雷达与相机标定
  7. 女神节,解密阿里女程序员们的代码诗!
  8. prism:如何创建一个张具有显著性差异的统计图?
  9. 《独家记忆》到底是什么高分甜剧,好看到网友通宵嗑糖?
  10. 白嫖彩虹云主机自制图床