最近实习+投简历+琐事弄得自己忙的不行不行的,终于今天可以开始记录一些东西了。。。

1.strlen函数的实现

 int strlen(const char *str){
assert(str!=NULL);
int len=;
while(*(str++) != '\0'){
len++;
}
return len;
}

2.strcmp函数的实现

int strcmp(const char *s, const char *p){
assert(s != NULL && p != NULL);
int ret = ;
while(!(ret = *(unsigned char *)s - *(unsigned char *)p) && *s){
s++;
p++;
}
if(ret > )return ;
if(ret < )return -;
return ret;
}

3.strcat函数的实现

char *strcat(char *dest, const char * src){
assert(dest != NULL && src != NULL);
char *addr = dest;
while(*addr != '\0'){
addr++;
}
while((*addr++ = *src++) != '\0');
return dest;
}

4.strcpy函数的实现

strcpy函数实现可以运用memcpy函数,原因就是memcpy函数实现的时候考虑到了内存重叠的情况,而strcpy函数的一般实现没有考虑到内存重叠的情况。

实现一:

char *strcpy(char *dest, const char *src){
assert(dest != NULL && src != NULL);
char *addr = dest;
while((*dest++ = *src++) != '\0');
return *addr;
}

实现二:

char *strcpy(char *dest, const char *src){
assert(dest != NULL && src != NULL);
char *addr = dest;
memcpy(dest, src, strlen(src)+);
return *addr;
}

5.memcpy函数的实现

memcpy函数实现的时候需要考虑内存重叠的情况。

void *memcpy(void *dest, const void *src, unsigned int count){
assert(dest != NULL && src != NULL);
void *addr = dest;
if(dest <= src || (char *)dest >= (char *)src+count){//这种情况不会发生问题,直接复制就好(画图看看吧!)
while(count--){
*(char *)dest = *(char *)src;
dest = (char *)dest+;
src = (cahr *)src+;
}
}else{//这种情况是src后端的一部分与dest前段的一部分重合,一旦从头开始复制就会将src后端与dest重合的部分覆盖掉,导致信息丢失而出错。
dest = (char *)dest+count-;
src = (char *)src+count-;
while(count--){
*(char *)dest = *(char *)src;
dest = (char *)dest-;
src = (char *)src-;
}
}
return addr;
}

strlen、strcmp、strcat、strcpy、memcpy基础函数的实现的更多相关文章

  1. 面试题:实现strcpy,strlen,strcmp,strcat,memcpy 之c-style字符串

    哪里可以看到c库函数的源码? gnu的c运行库glibc,但是源码的实现却是复杂的,需要考虑效率,stlen源码分析. c-style字符串有个约定,以空字符结尾,即 '\0' . ' }; &quo ...

  2. strlen sizeof strcat strcpy区别

      strlen(p): 能计算出p指向字符串的长度(以当前p的位置开始),不包含终止字符'\0': p可以声明为char* p或者char p[],这两种形式strlen均能正确计算. sizeof ...

  3. strcpy, memcpy, memset函数

    一. strcpy函数 原型声明:char *strcpy(char* dest, const char *src);   头文件:#include <string.h> 和 #inclu ...

  4. strcpy,memcpy,memset函数实现

    strcpy 实现,只能拷贝字符串 char* strcpy(char* des,const char* source) { char* r=des; assert((des != NULL) &am ...

  5. 自己实现字符串操作函数strlen(),strcat(),strcpy(),strcmp()

    1.strlen()函数是求解字符串的有效长度的 1)非递归实现 size_t my_strlen(const char *str) { assert(str != NULL);  //断言,保证指针 ...

  6. 实现字符串函数,strlen(),strcpy(),strcmp(),strcat()

    实现字符串函数,strlen(),strcpy(),strcmp(),strcat() #include<stdio.h> #include<stdlib.h> int my_ ...

  7. strlen strcat strcpy strcmp 自己实现

    strlen strcat strcpy strcmp 自己实现 strlen include <stdio.h> #include <string.h> #include & ...

  8. memcpy的函数

    网新恒天2014校园招聘笔试编程题 已知memcpy的函数为: void* memcpy(void *dest , const void* src , size_t count)其中dest是目的指针 ...

  9. (2.16)Mysql之SQL基础——函数

    (2.16)Mysql之SQL基础——函数 关键词:mysql函数,mysql自定义函数,mysql聚合函数,mysql字符串函数,mysql数值函数 1.自定义函数 -- (1)一般形式 creat ...

随机推荐

  1. 工作无聊,闲来无事,自己学习 android入门

    工作无聊,闲来无事,自己学习. 最近几天看了看有关android的UI设计,布局以及android有关控件的知识,算是进一步了解了 android的相关内容. 明天就是周末了,明天及后天,我打算开始学 ...

  2. 如何获取版本的 Internet 信息服务器 (IIS)

    不同的操作系统对应不同IIS http://support.microsoft.com/kb/224609/zh-cn

  3. poj 1734 Sightseeing trip_ 最小环记录路径

    题意:求最出小环,输出路径 #include <iostream> #include<cstdio> using namespace std; #define N 110 #d ...

  4. 网站服务管理系统wdcp简介及功能特性

    WDCP是WDlinux Control Panel的简称,是一套用PHP开发的Linux服务器管理系统以及虚拟主机管理系统,,旨在易于使用Linux系统做为我们的网站服务器,以及平时对Linux服务 ...

  5. vsts

     首先要搞清楚啥是VSTS,这对于我们安装配置有基础作用.看看这张组织结构图就一目了然了.Visual Studio Team Suite就是我们常说的VS.NET 2005开发环境,安装包3G左右的 ...

  6. ng-validate

    客户端表单验证是AngularJS里面最酷的功能之一. AngularJS表单验证可以让你从一开始就写出一个具有交互性和可相应的现代HTML5表单. 在AngularJS中,有许多表单验证指令.在这里 ...

  7. RDLC报表系列(四) 矩阵

    继续接上一篇的内容,本文主要是讲矩阵的内容 用到的数据源如下: DataTable dt = new DataTable(); dt.Columns.Add("FiscalYear" ...

  8. Android 内部启动其他应用,以及打开指定qq聊天界面

    在自己应用中打开第三方应用,有好多种方法,这里举例一种: //以打开微信为例,前提需要知道打开应用的包名,一般一个发布版本的应用,包名不会轻易改变的,但是,打开QQ就要注意了,毕竟QQ的发布版本有不下 ...

  9. WinCmd

    Q1:tracert Tracert (跟踪路由)是路由跟踪实用程序,用于确定 IP 数据报访问目标所采取的路径. Tracert 命令用 IP 生存时间 (TTL) 字段和 ICMP 错误消息来确定 ...

  10. sql server 2008 (3)

    数据库表常用术语 关系--即二维表.每个关系都有个关系名,就是表名 域:取值范围 记录--行 字段,属性--列 关联--指哪个数据库表之间的数据彼此联系的方式 关键字:属性或属性的组合,可以唯一标识一 ...