代码来自:

http://blog.csdn.net/v_JULY_v

//得9 分
//为了实现链式操作,将目的地址返回,加2 分!
char * strcpy( char *strDest, const char *strSrc )
{
assert( (strDest != NULL) && (strSrc != NULL) );
char *address = strDest;
while( (*strDest++ = * strSrc++) != '/0' );
return address;
} //得10 分,基本上所有的情况,都考虑到了
//如果有考虑到源目所指区域有重叠的情况,加1 分!
char * strcpy( char *strDest, const char *strSrc )
{
if(strDest == strSrc) { return strDest; }
assert( (strDest != NULL) && (strSrc != NULL) );
char *address = strDest;
while((*strDest++ = *strSrc++)!='/0');
return address;
}
strncpy 是 C语言的函数之一,来自 C语言标准库,定义于 string.h,char *strncpy(char *destin, char *source, int maxlen),把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。
char *strncpy(char *strDes, const char *strSrc, unsigned int count)
{
assert(strDes != NULL && strSrc != NULL);
char *address = strDes;
while (count-- && *strSrc != '/0')
*strDes++ = *strSrc++;
*strDes = '/0';
return address;
}

strcpy和memcpy都是标准C库函数,它们有下面特点:

strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容外,还会复制字符串的结束符。

strcpy的函数原型是:char* strcpy(char* dest, const char* src);

memcpy只提供一般的内存复制,即memcpy对于需要复制的内容没有限制,因此用途更广。

memcpy的函数原型是:void *memcpy(void *dest,  const char* src,  size_t count);

  char *strcpy(char *dest, const char *src)
  {
     if((src == NULL) || (dest == NULL))
      {
          return NULL;
     }
 
     char *strdest = dest; // 保存目标字符串的首地址
     while((*dest++ = *str) != '\0');
     return strdest;
 }

void *memcpy(void *memTo, const char *memFrom, size_t size)
{
     if((memTo == NULL) || (memFrom == NULL))
     {
          return NULL;
     }      char *tempFrom = (char *)memFrom; //保存memFrom的首地址
     char *tempTo = (char *)memTo; //保存memTo的首地址
      while(size-- > 0)
     {
          *tempTo++ = *tempFrom++;
     }
     return memTo;
}

strcpy 和 memcpy主要有以下三方面的区别:

1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符串、整型、结构体、类等。

2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符串的结束符"\0”才结束,所以容易溢出。memcpy则是根据第3个参数决定复制的长度。

3、用途不同。通常在复制字符串时用strcpy,而需要复制其它类型的数据是用memcpy。

memcpy 和 memmove 都是C语言中的库函数,在库函数 string.h中,其原型相似,它们都是从src所指向的内存中复制count个字节到dest所指内存中。并返回dest的值。

当源内存区域 和 目标内存区域无交叉重叠时,两者的结果是一样的,但如果有交叉呢?

memcpy是从src的其实部分开始复制,所以虽然第一种情况下没有问题,但如果遇到第二种情况,则会发生错误,交叉部分的src内容就会被覆盖掉了。

而memmove则由于采用不同的复制机制,所以可以正确处理第二种情况。


void *memmove(void *dst,const void *src,int n)
{
     char *dp = (char *)dst;
     char *sp = (char *)src; 
     assert((src!=0)&&(dst!=0)&&(n>0));//not null 
     //非重叠 
      //dp < sp 
     //dp > (sp+n)
     if(sp>dp||(sp+n)<dp)
     { 
         while(n--) 
             *(dp++) = *(sp++);
         *dp = '\0';
     }
     else if(sp<dp)//重叠 (此时条件 sp<dp<(sp+n))如果sp==dp则快速的返回
     {//反向拷贝  
          sp += n; 
         dp += n; 
         *dp = '\0'; 
         while(n--)
            *(--dp) = *(--sp); 
     }
     return dst;
}       

在很多库函数上看到使用了assert()函数,assert函数的作用是计算表达式expression ,如果其值为假(即为0),那么它先向stderr打印一条错误信息,然后调用abort()来终止进程。

函数名: abort
功 能: 异常终止一个进程
描述:abort()函数首先解除进程对SIGABRT信号的阻止,然后向调用进程发送该信号。abort()函数会导致进程的异常终止除非SIGABRT信号被捕捉并且信号处理句柄没有返回。
abort()函数导致所有的流被关闭和冲洗。
abort()函数没有返回值:void abort(void);
用 法: void abort(void);
程序例:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("Calling abort()\n");
abort();
return 0; /* This is never reached */
}

c语言部分库函数,代码实现,以及细节理解的更多相关文章

  1. 通过调用C语言的库函数与在C代码中使用内联汇编两种方式来使用同一个系统调用来分析系统调用的工作机制

    通过调用C语言的库函数与在C代码中使用内联汇编两种方式来使用同一个系统调用来分析系统调用的工作机制 前言说明 本篇为网易云课堂Linux内核分析课程的第四周作业,我将通过调用C语言的库函数与在C代码中 ...

  2. C语言之库函数的模拟与使用

    C语言之库函数的模拟与使用 在我们学习C语言的过程中,难免会遇到这样的一种情况: 我们通常实现一个功能的时候,费尽心血的写出来,却有着满满的错,这时却有人来告诉你说:这个功能可以用相应的库函数来实现. ...

  3. 【伯乐在线】最值得阅读学习的 10 个 C 语言开源项目代码

    原文出处: 平凡之路的博客   欢迎分享原创到伯乐头条 伯乐在线注:『阅读优秀代码是提高开发人员修为的一种捷径』http://t.cn/S4RGEz .之前@伯乐头条 曾发过一条微博:『C 语言进阶有 ...

  4. C语言中库函数strstr的实现

    在C语言中库函数strstr()函数表示在一个字符串str1中查找另一个字符串str2,如果查到则返回str2在str1中首次出现的位置,如果找不到则返回null. char* strstr(char ...

  5. VS2015提示:未安装Style的Visual Studio语言支持,代码编辑Intellisense将不可用。服务器控件的标记Intellisense可能不起作用

    一.问题 最近在VS2015打开文件,提示未安装Style的Visual Studio语言支持,代码编辑Intellisense将不可用.服务器控件的标记Intellisense可能不起作用. Int ...

  6. 小C和小派的缠绵爱情——C语言调用Python代码

    我妒忌你的开源,你眼红我的速度,不如我们就在一起吧! --------SJ2050 2019.4.9号更新:实现在未安装python环境的机子上运行调用了python程序的C语言代码! 文章目录 环境 ...

  7. 问题解决:补充安装c语言的库函数和系统调用man手册

    问题解决:补充安装c语言的库函数和系统调用man手册 ​ 今日份麻麻~上课时大家的Ubuntu都可以通过man查到关于stat的库函数,但是我的Kali查出来是这样: ​ 询问老师之后得知需要去安装相 ...

  8. 对于 C语言的扩展和JAVA的重载理解

    哎,又被学长看成笨蛋了  ,先前学习java,自己真是什么都要忘了,弄得自己连java最重要的概念--重载,都不知道是啥,还厚着脸皮和学长说  是函数名字一样  ,但是就是函数里面的参数和参数类型不一 ...

  9. C++调用C语言的库函数

    在项目中,使用C语言编写了一个socket后台程序tkcofferd,并且为方便客户端的使用,提供了动态库,其中包含socket接口. 现在的需求是使用qt做一个前端界面,用来展示tkcofferd的 ...

随机推荐

  1. Android 系统自动重启Bug(高通平台)

    点击打开链接 最近客户反馈了一个Bug,我们的系统用着用着会自动重启,尤其是在拨号的时候极容易死机或者进入下载模式.根据老大和高通的支持得到了一个解决方案. 在Android系统中,有这么一个文件夹: ...

  2. Eclipse打jar包,资源文件的读取

    最近的工作中需要将java程序打一个jar包,然后在Linux中供调用.程序中需要读取一个配置文件.遇到了三个问题.第一个是依赖的第三方Jar包打成Jar包后找不到:第二个问题是资源文件所在的文件夹打 ...

  3. Retrofit 2.0 超能实践(三),轻松实现文件/多图片上传/Json字符串

    文:http://blog.csdn.net/sk719887916/article/details/51755427 Tamic 简书&csdn同步 通过前两篇姿势的入门 Retrofit ...

  4. iOS下JS与OC互相调用(三)--MessageHandler

    使用WKWebView的时候,如果想要实现JS调用OC方法,除了拦截URL之外,还有一种简单的方式.那就是利用WKWebView的新特性MessageHandler来实现JS调用原生方法. Messa ...

  5. Activity之间的数据传递-android学习之旅(四十七)

    activity之间的数据传递主要有两种,一种是直接发送数据,另一种接受新启动的activity返回的数据,本质是一样的 使用Bundle传递数据 Intent使用Bundle在activity之间传 ...

  6. Android程序崩溃异常收集框架

    最近在写Android程序崩溃异常处理,完成之后,稍加封装与大家分享. 我的思路是这样的,在程序崩溃之后,将异常信息保存到一个日志文件中,然后对该文件进行处理,比如发送到邮箱,或发送到服务器. 所以, ...

  7. 如何设制 select 不可编辑 只读

    1. <select style="width:195px" name="role"  id="role" onfocus=" ...

  8. MyEclipse9安装Checkstyle5.5插件(图解)

    ①首先下载Eclipse Checkstyle Plug-in     官方首页:http://sourceforge.net/projects/eclipse-cs/files/     最新版为: ...

  9. Android官方命令深入分析之Hierarchy Viewer

    Hierarchy Viewer允许你调试和优化用户界面.它提供了一个层可视的方式来显示. 启动Hierarchy Viewer,如下: 在Android Studio中,选择Tools > A ...

  10. xml解析之sax解析原理图和技术介绍

    SAX解析工具-  Sun公司提供的.内置在jdk中.org.xml.sax.* 核心的API: SAXParser类: 用于读取和解析xml文件对象 parse(File f,DefaultHand ...