strncpy

想必大家经常会用到复制字符串的函数吧,有时候不经意就会用到strncpy(),我有时也有用到过,但是殊不知这个函数隐藏一些缺陷。先来了解strncpy吧
原型:
char *strncpy(char *dest, const char *src, size_t n)
参数:
dest – 指向用于存储复制内容的目标数组。
src – 要复制的字符串。
n – 要从源中复制的字符数。
返回值:
最终复制的字符串

易错点

ps:strncpy()不会向dest追加结束标记’\0’,这就引发了很多不合常理的问题.
strncpy复制后dest如果最后一个没有’\0’,用dest的时候没有结束位置,后续对于字符串的操作可能会造成内存的非法访问.
如:printf("%s\n",dest);
这句话可能就会输出一些不是你想要的结果。
标准用法

strncpy(path, src, sizeof(path) - 1);
path[sizeof(path) - 1] = '\0';
len = strlen(path);

手动的添加’\0’,避免出错。
注意:
src 和 dest 所指的内存区域不能重叠,且 dest 必须有足够的空间放置n个字符。但是也并不是说dest的空间越大就越好。
http://c.biancheng.net/cpp/html/170.html这个博主有详细的举例可以看一下

建议

网上的其他博主也有发帖,可以使用strlcpy()代替strlcpy,这个函数相对于strncpy好用很多。
优点:
1、不需要手动添加’\0’.函数会复制n-1个字符,最后一个字符添加’\0’。
2、函数的返回值是strlen(src),可直接判断是否被截断。

strlcpy(path, src, sizeof(path));
len = strlen(path);
if ( len >= sizeof(path) )printf("src is truncated.");

当然还有其他的一些字符串拷贝函数,大家可以看看其他博主的。

本篇只是个人觉得自己之前没有注意到的点,欢迎大佬的指点让我进步,感谢感谢。

最常见的strncpy函数的缺陷,‘\0‘问题相关推荐

  1. 【C语言】strncpy函数和strncpy_s函数的不同!关于末尾追加\0

    今天在微软家的strncpy_s函数上栽了跟头,记录一下 char *strncpy(char *strDest, const char *strSource, size_t count ); err ...

  2. C语言strcpy、strncpy函数是否会复制‘\0‘结束符

    1.首先看看strcpy函数的原型 /* strcpy函数原型*/ char *strcpy(char *est,const char *src) {assert((dest!=NULL)&& ...

  3. 深析strcpy与strncpy函数的功能及缺陷

    首先,两者都是字符串拷贝函数,不同的是两个的参数个数不一样. char *strcpy(char *dest,const char *src) char *strncpy(char *dest,con ...

  4. linux c之strncpy函数和strncmp函数最简单使用总结

    1.原型声明: char * strncpy(char *dest,const char *src, size_t n); strncmp() 用来比较两个字符串的前n个字符,区分大小写,其原型为: ...

  5. 常见的字符函数与字符串函数介绍(1)

    常见的字符函数与字符串函数介绍 前言 C语言中对字符与字符串的处理很是频繁,但是C语言中并没有字符串类型的变量,字符串通常存放在常量字符串或者字符数组中.字符串常量适用于那些对它不做任何修改的字符串函 ...

  6. 再谈strncpy函数--值得一看的好文章

    strncpy()函数 原型:char*strncpy(char *dest, char *src, int n);     用法:#include<string.h>     功能:把s ...

  7. c语言strcpy、strcmp、strcat等常见字符操作函数的介绍

    字符串是c语言中一种常见的数据类型,字符串属于常量,不可修改,如果我们想要修改,就要把它放在字符数组中来对其进行修改,而有一些函数可以帮助我们完成一些常用的操作字符串的动作,下面我们就来介绍一些常用字 ...

  8. strncpy()函数详解

    strncpy()函数 原型:extern char *strncpy(char *dest, char *src, int n);     用法:#include <string.h>  ...

  9. 小探strncpy函数

    strncpy函数原型 原型:extern char *strncpy(char *dest, char *src, int n);用法:#include <string.h>功能:把sr ...

最新文章

  1. 贸易保护主义不能解决德国光伏企业的问题
  2. JS脚本语言 JavaScript
  3. 恶意软件、Rootkit和僵尸网络
  4. 玩转SSRS第十篇---自定义代码
  5. docker网络之macvlan
  6. SAP透明工厂和弹性制造的原型mockup - SAP 工业 4.0 的一个尝试
  7. 1439: 2.4.5 Fractions to Decimals 分数化小数
  8. 【JEECG dubbo专题】Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
  9. 【官方教程】Ubuntu 安装 mongoDB
  10. 洛谷——P2524 Uim的情人节礼物·其之弐
  11. Atom: 几个常用的快捷键,恢复主菜单
  12. 剑指_复杂链表的复制(Python)
  13. 《高数》 符号全集(持续更新。。。)
  14. 网站服务器历史解析记录查询,域名解析ip历史查询
  15. 一个有趣的二维码生成库Qart
  16. 【技术贴】Realtek HD声卡下QQ语音话筒没声音解决办法
  17. LED软模组圆弧屏、弧形屏、柔性软屏、创意LED显示屏案例
  18. 教师人生格言积极向上的句子
  19. 信贷风控报表常用指标解读(一)
  20. 《Python 深度学习》6.1.3 整合在一起:从原始文本到词嵌入

热门文章

  1. 2021年10月虹科Pico汽车示波器简报
  2. php检测是否是手机访问
  3. 完美解决,问题:word 内存或磁盘空间不足,保存失败。
  4. 【CSS】东方财富网的杜邦分析图
  5. 三个方法让你播音主持正确发声
  6. 用Python实现电脑手机文件互传秒完成
  7. 今天做一个测评:阿里云磁盘读写速率测评
  8. iOS关于UIWebView和Javascript相互调用及WebViewJavascriptBridge分析
  9. HQChart实战教程61-自定义十字星K线颜色
  10. hadoop离线day03--Hadoop HDFS