当前位置: 首页 > news >正文

strcpy和strncpy用法和区别

  1. strcpy函数:顾名思义字符串复制函数:原型:extern char *strcpy(char *dest,char *src); 功能:把从src地址开始且含有NULL结束符的字符串赋值到以dest开始的地址空间,返回dest(地址中存储的为复制后的新值)。要求:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
      一般函数原型实现方式:
      char * strcpy(char * strDest,const char * strSrc)
      {
      char * strDestCopy=strDest; //[3]
      if ((strDest==NULL)||(strSrc==NULL)) //[1]
      throw “Invalid argument(s)”; //[2]
      while ((*strDest++=*strSrc++)!=’\0’); //[4]
      return strDestCopy;
      }
      该函数的参数是字符指针,也就是可以是字符串变量和字符数组,因为它们的变量名代表首字符地址。字符串默认有一个null结束符,字符数组没有。所以此处需要注意:因为src要求有null结束符,所以字符数组的长度必须大于等于src包含null结束符的总长度。例如,char* src=”abcd”; char dest[5]; 这里dest的长度就至少为5。
  2. strncpy函数:多个n代表可以指定字符个数进行赋值。原型:char * strncpy(char *dest, char *src, size_tn); 功能:将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样遇到NULL才停止复制,而是等凑够n个字符才开始复制),返回指向dest的指针。要求:如果n > dest串长度,dest栈空间溢出产生崩溃异常。该函数注意的地方和strcpy类似,但是n值需特别注意,
      1)src串长度<=dest串长度,(这里的串长度包含串尾NULL字符)
      如果n=(0, src串长度),src的前n个字符复制到dest中。但是由于没有NULL字符,所以直接访问dest串会发生栈溢出的异常情况。这时,一般建议采取memset将dest的全部元素用null填充,如:memset(dest,0,7)(7为从dest起始地址开始前7个位置填充null,dest可以为字符指针和数组名)。注意:char* pc=”abc”; char chs[5]; sizeof(pc)为4(包含null)(有些编译器不行),sizeof(chs)为5。
      如果n = src串长度,与strcpy一致。
      如果n = dest串长度,[0,src串长度]处存放于desk字串,(src串长度, dest串长度]处存放NULL。
      2)src串长度>dest串长度
      如果n =dest串长度,则dest串没有NULL字符,会导致输出会有乱码。如果不考虑src串复制完整性,可以将dest最后一字符置为NULL。
      所以,一般把n设为dest(含null)的长度(除非将多个src复制到dest中)。当2)中n=dest串长度时,定义dest为字符数组,因为这时没有null字符拷贝。

相关文章:

  • [POJ 2406]Power Strings[KMP]
  • markdown语法
  • BestCoder 2nd Anniversary #1001-oracle
  • [NOIP 2015] Day.1 T1 神奇的幻方 [模拟]
  • [NOIP 2015]Day.1 T2 信息传递 【最小环】
  • 查找有向图中的环
  • 求无向图最小环算法-floyd
  • [hdu 3746] Cyclic Nacklace [kmp]
  • [poj 2001]Shortest Prefixes [Trie]
  • Trie - 字典树 模板
  • [hdu 1247]Hat’s Words [Trie 图]
  • Trie树专题 [转]
  • using声明、using指示及其作用域详解
  • using声明、using指示用于嵌套命名空间时的作用域
  • C语言运算符优先级列表
  • [PHP内核探索]PHP中的哈希表
  • 「译」Node.js Streams 基础
  • 【EOS】Cleos基础
  • Android开源项目规范总结
  • angular2开源库收集
  •  D - 粉碎叛乱F - 其他起义
  • ES6之路之模块详解
  • Laravel 菜鸟晋级之路
  • Nodejs和JavaWeb协助开发
  • node学习系列之简单文件上传
  • ucore操作系统实验笔记 - 重新理解中断
  • VuePress 静态网站生成
  • Vue官网教程学习过程中值得记录的一些事情
  • Web Storage相关
  • 诡异!React stopPropagation失灵
  • 七牛云假注销小指南
  • 微信小程序开发问题汇总
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • %@ page import=%的用法
  • (1)常见O(n^2)排序算法解析
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (4)Elastix图像配准:3D图像
  • (BFS)hdoj2377-Bus Pass
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (一)kafka实战——kafka源码编译启动
  • (转)【Hibernate总结系列】使用举例
  • **PHP分步表单提交思路(分页表单提交)
  • *Django中的Ajax 纯js的书写样式1
  • *上位机的定义
  • .mysql secret在哪_MySQL如何使用索引
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .Net Web窗口页属性
  • .NET 解决重复提交问题
  • .net反编译工具
  • .NET命名规范和开发约定