C语言 - strcpy和strncpy的编程实现及总结
一、字符串的strcpy与strncpy函数
1、编程实现strcpy函数(笔试很容易考到)
要求:
原型:char *stpcpy(char *strDest,char *strSrc);
头文件:#include <string.h>
功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest结尾处字符(NULL)的指针。
strcpy的代码实现:
char * strCpy(char * strDest,const char * strSrc) //[1]
{
//函数assert的头文件为#include<assert.h>
assert((strDest != NULL)&&(strSrc != NULL)); //[2] char * strDestCopy=strDest; //[3]
while ((*strDest++ = *strSrc++) != '\0'); //[4] return strDestCopy; //[5]
}
代码的分析:
代码[1]:可能会忘记代码中的参数列表以及返回值
代码[2]:很多人会忘记对字符串指针的检查,这一部分能体现程序员的严谨性,主要体现在一下三点,
a、不检查指针的有效性,说明答题者不注重代码的健壮性
b、检查指针的有效性时使用((!strDest)||(!strSrc))或(!(strDest&&strSrc)),说明答题者对C语言中类型的隐式转换没有深刻认识
c、检查指针的有效性时使用((strDest==0)||(strSrc==0)),说明答题者不知道使用常量的好处
代码2也可以写: if ((strDest == NULL)||(strSrc == NULL))
throw "Invalid argument(s)"; //throw为抛出异常
代码[3]: 忘记保存原始的strDest值,说明答题者逻辑思维不严密。
代码[4]:没有什么硬性的要求,这部分功能比较容易实现,考虑到边界问题就可以了
代码[5]:返回值是为了链式调用(一般情况下放回值是字符串类型的指针都是为了链式调用)
2、编程实现strncpy函数
要求:
原型: char *strncpy(char *strDest, char *strSrc, int n);
头文件:#include <string.h>
功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。
说明:
1、如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。
2、如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。
3、src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回值:指向dest的指针。
strncpy代码实现:
char * my_strncpy(char *strDest, const char *strSrc, int num)
{
assert((strDest != NULL) && (strSrc != NULL));
//if (strDest == NULL || strSrc == NULL) return NULL; //保存目标字符串的首地址
char *strDestcopy = strDest;
while ((num--)&&(*strDest++ = *strSrc++) != '\0');
//如果num大于strSrc的字符个数,将自动补'\0'
if (num > )
{
while(--num)
{
*strDest++ = '\0';
}
}
return strDestcopy;
}
代码分析:
1、代码strncpy与代码strcpy其实相差不大,
2、需要考虑到,如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。
C语言 - strcpy和strncpy的编程实现及总结的更多相关文章
- strcpy、strncpy与memcpy的区别与使用方法
strcpy.strncpy.memcpy这三个C语言函数我们在主机代码编写中会很频繁的使用到,但是三个函数的区别.使用时该注意什么还是有必要说下的. 本文参考<C 标准库>编写. 一.函 ...
- C语言与VT100控制码编程
C语言与VT100控制码编程 声明: . 如果您打算阅读本文,希望您已经了解过C语言的基本语法,本文不对C语言的基本语法进行说明,因为那些东西几乎唾手可得; . 本文在vim中编辑,请尽量是用vim进 ...
- R语言基于S4的面向对象编程
前言 本文接上一篇文章 R语言基于S3的面向对象编程,本文继续介绍R语言基于S4的面向对象编程. S4对象系统具有明显的结构化特征,更适合面向对象的程序设计.Bioconductor社区,以S4对象系 ...
- strcpy、strncpy、memcpy的区别
一.strcpy.strncpy区别 struct gpInfo { char gpcode[9]; char gpName[50]; }; string gpstr = "SZ000001 ...
- Go语言面组合式向对象编程基础总结
转自:http://blog.csdn.net/yue7603835/article/details/44282823 Go语言的面向对象编程简单而干净,通过非侵入式接口模型,否定了C/C++ Jav ...
- [置顶]
strcpy()与strncpy()的区别
头文件:#include <string.h> strcpy() 函数用来复制字符串,其原型为: char *strcpy(char *dest, const char *src); [参 ...
- C语言控制台窗体图形界面编程(总结)
本系列文章是笔者通过学习<C语言控制台窗体界面编程(修正版)>而写(关于此文档的很多其它信息请看本系列文章第一篇),旨在让大家更加清晰简洁easy地学习C语言控制台窗体界面的编程. 通过本 ...
- Python语言基础07-面向对象编程基础
本文收录在Python从入门到精通系列文章系列 1. 了解面对对象编程 活在当下的程序员应该都听过"面向对象编程"一词,也经常有人问能不能用一句话解释下什么是"面向对象编 ...
- C语言与汇编的嵌入式编程:求100以内素数
写汇编之前,需要搞清楚C语言代码的写法,这里以最简单的算法举例说明 C代码如下: #include <stdio.h> void main(){ int i,j; ; ;i<=;i+ ...
随机推荐
- 设计模式:策略模式(Stratege)
首先我们需要知道策略模式与状态模式是如此的相似,就犹如一对双胞胎一样.只不过状态模式是通过改变对象内部的状态来帮助对象控制自己的行为,而策略模式则是围绕可以互换的算法来创建成功业务的.两者都可用于解决 ...
- 移除django的旧版本
移除django的旧版本 下面这一段代码打进去绝对能看到你想要的,根据这个路径去找版本文件夹,他的名字应该是django.2xx.xxx很长一段,请你删了它! import django import ...
- 移动端、pc端通用点击复制
点击复制 function copyArticle(event){ const range = document.createRange(); range.selectNode(document.ge ...
- vue cli3项目发布在apache www/vue目录下并配置history路由
注意:vue项目打包后默认是指向服务器的根路径(比如apache默认www目录是根路径,当然也可以修改),这种情况不需要做路径的配置,只需要做history配置,如果不是发布到根路径而是www/vue ...
- Asp.net4.5未在web服务器上注册
在使用vs2012打开项目时,显示Asp.net4.5未在web服务器上注册?是由于没有下载一个补丁的原因,只需下载安装补丁 VS11-KB3002339.exe 下载地址:https://downl ...
- 第二章 单表查询 T-SQL语言基础(2)
单表查询(2) 2.2 谓词和运算符 T-SQL有几种不同的语言元素可以指定逻辑表达式,例如,查询过滤器(WHERE和HAVING),CHECK约束,等等. 在逻辑表达式中可以使用各种谓词(取值为TR ...
- vue cli更新
关于旧版本 Vue CLI 的包名称由 vue-cli 改成了 @vue/cli. 如果你已经全局安装了旧版本的 vue-cli (1.x 或 2.x),你需要先通过 npm uninstall vu ...
- 埋在 MYSQL 数据库应用中的17个关键问题!
Mysql的使用非常普遍,跟mysql有关的话题也非常多,如性能优化.高可用性.强一致性.安全.备份.集群.横向扩展.纵向扩展.负载均衡.读写分离等.要想掌握其中的精髓,可得花费不少功力,虽然目前流行 ...
- Spring的AOP,Struts2的拦截器(Interceptor),以及springMVC的(interceptor)
参考外链:http://www.ibm.com/developerworks/cn/java/j-lo-springaopfilter/ 1.首先,spring的AOP作用范围很广,可以使用Aspec ...
- ubuntu自己定义环境变量,替代常用的操作命令
问题背景是这样的,因为自己会经常用自己的用户链接服务器,比如自己的用户是yongjie,然后服务器的ip是162.105.97.31 所以经常执行的命令是ssh yongjie@162.105.97. ...