strlen、strcmp、strcat、strcpy、memcpy基础函数的实现
最近实习+投简历+琐事弄得自己忙的不行不行的,终于今天可以开始记录一些东西了。。。
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基础函数的实现的更多相关文章
- 面试题:实现strcpy,strlen,strcmp,strcat,memcpy 之c-style字符串
哪里可以看到c库函数的源码? gnu的c运行库glibc,但是源码的实现却是复杂的,需要考虑效率,stlen源码分析. c-style字符串有个约定,以空字符结尾,即 '\0' . ' }; &quo ...
- strlen sizeof strcat strcpy区别
strlen(p): 能计算出p指向字符串的长度(以当前p的位置开始),不包含终止字符'\0': p可以声明为char* p或者char p[],这两种形式strlen均能正确计算. sizeof ...
- strcpy, memcpy, memset函数
一. strcpy函数 原型声明:char *strcpy(char* dest, const char *src); 头文件:#include <string.h> 和 #inclu ...
- strcpy,memcpy,memset函数实现
strcpy 实现,只能拷贝字符串 char* strcpy(char* des,const char* source) { char* r=des; assert((des != NULL) &am ...
- 自己实现字符串操作函数strlen(),strcat(),strcpy(),strcmp()
1.strlen()函数是求解字符串的有效长度的 1)非递归实现 size_t my_strlen(const char *str) { assert(str != NULL); //断言,保证指针 ...
- 实现字符串函数,strlen(),strcpy(),strcmp(),strcat()
实现字符串函数,strlen(),strcpy(),strcmp(),strcat() #include<stdio.h> #include<stdlib.h> int my_ ...
- strlen strcat strcpy strcmp 自己实现
strlen strcat strcpy strcmp 自己实现 strlen include <stdio.h> #include <string.h> #include & ...
- memcpy的函数
网新恒天2014校园招聘笔试编程题 已知memcpy的函数为: void* memcpy(void *dest , const void* src , size_t count)其中dest是目的指针 ...
- (2.16)Mysql之SQL基础——函数
(2.16)Mysql之SQL基础——函数 关键词:mysql函数,mysql自定义函数,mysql聚合函数,mysql字符串函数,mysql数值函数 1.自定义函数 -- (1)一般形式 creat ...
随机推荐
- Linux下 nginx + 最新版php5.5 安装配置详解
1.nginx的安装: 首先nginx的安装需要依赖最基础的三个包,这里面我们不设计更多的扩展模块,只是安装最基础的三个包, zlib 此包主要是对http内容进行gzip压缩,减少网络传输流量 PC ...
- 一次rman恢复的实验
本文主要针对备份和恢复数据文件,具体rman知识点查阅我的另一篇文章:http://blog.csdn.net/perfect_db/article/details/8765022 首先看看数据文件的 ...
- cf467C George and Job
C. George and Job time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- 【Leetcode】二叉树层遍历算法
需求: 以层遍历一棵二叉树,二叉树的结点结构如下 struct tree_node{ struct tree_node *lc; struct tree_node *rc; int data; }; ...
- linux命令之mount
熟悉linux的同学都应该知道mount命令.在linux中,一切皆文件.硬盘分区都是以文件目录的方式存在. 如果我们想访问移动硬盘,U盘等我们必须将这些设备mount到我们linux文件系统中某个目 ...
- C Deepin指针
L-value -->标识了一个可以存储结果值的内存存储地址--指针变量 or 普通内存变量; R-value -->数值;
- linux监控脚本,脚本支持传参,整合C程序
1,查看指定用户下的进程pid
- 2.2.2 胸腰差和胸臀差的应用_米人NOONE_新浪博客
2.2.2 胸腰差和胸臀差的应用_米人NOONE_新浪博客 腰差和胸臀差的应用(2009-06-16 19:24:57)转载▼标签:校园 前面已经对这两个概念作了简单的讲解.这两个概 ...
- 解决:Incorrect line ending: found carriage return (\r) without corresponding newline (\n)
解决方案: ——clean一下项目,这个方法可以解决 . 此方案经过验证OK
- Android 4.4 Kitkat 使能 USB adb 功能
背景 在 Linux-3.8 以后,Android 的内核分支,便去掉了 f_adb,改使用 USB function FS,在用户空间实现 USB adb 功能.这篇文章依据原作者的 Google+ ...