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

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. C语言--C语言程序

    一.代码的编写 1.程序结构 1> C语言程序的结构:由函数构成 *任何一个c语言程序都是由一个或者多个程序段(小程序)构成的,每个程序段都有自己的功能,我们一般称这些程序段为“函数”.所以,我 ...

  2. 使用AES加密的帮助类

    在开发中经常使用加密/解密对一些内容进行处理,比如密码在存入数据库之前先经过加密处理等等,这里就把一个加密帮助类代码贴出来,供以后查找使用. 这个帮助类主要功能是对字符串和字节数组进行加密解密处理. ...

  3. 如何重载浏览器 onload 事件后加载的资源文件

    http://www.oschina.net/translate/reloading-post-onload-resources?lang=eng 怎么在webview中加载本地jquery.mi.j ...

  4. MFC子窗口和父窗口(SetParent,SetOwner)

    一.概念和区别 在windows系统中,每个窗口对象都对应有一个数据结构,形成一个list链表.系统的窗口管理器通过这个list来获取窗口信息和管理每个窗口.这个数据结构中有四个数据用来构建list, ...

  5. Opencv2.4.4作图像旋转和缩放

    关于下面两个主要函数的讲解: cv::getRotationMatrix2D(center, angle, scale); cv::warpAffine(image, rotateImg, rotat ...

  6. CentOS7 lamp安装 centoOS6 lamp

    快速lamp安装 How To Install Linux, Apache, MySQL, PHP (LAMP) stack On CentOS 7 Introduction A "LAMP ...

  7. [C++ 2011 STL (VS2012 Update4) 源代码阅读系列(2)]熟悉一些宏定义和模版偏特化或叫模版专门化

    [C++ 2011 STL (VS2012 Update4) 源代码阅读系列(2)]熟悉一些宏定义和模版偏特化或叫模版专门化 // point_test.cpp : 知识点练习和测试,用于单步调试,跟 ...

  8. 关于select

    select 1与select * 的区别:“selelct 常量 from 表名” 对应所有行,返回的永远只有一个值,即常量 ,所以一般只用来判断是否有表记录:而“select * from 表名” ...

  9. leetcode_question_102 Binary Tree Level Order Traversal

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  10. 理解js异步的概念

    js引擎在执行的时候是单线程的,这是大家都知道的.我们先来看一段代码: <html> <head> <meta http-equiv="Content-Type ...