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 ...
随机推荐
- Hibernate 体系结构简述
SessionFactory: Hibernate的关键对象,它是单个数据库映射关系经过编译后的内存镜像,同时它是线程安全的.它是生成Session的工厂,本身需要依赖于ConnectionProvi ...
- C语言的本质(27)——C语言与汇编之计算机结构
现代计算机都是基于冯·诺依曼或哈佛体系结构的,不管是嵌入式系统.个人电脑还是服务器.这种两种体系结构的主要特点是:CPU和内存是计算机的两个主要组成部分,内存中保存着数据和指令,CPU从内存中取指令执 ...
- cocos2d js 怎样动态载入外部图片
官网没有详细样例,仅仅有看api,研究成果例如以下 var that = this; var url = "http://xxxxxx"; cc.loader.loadImg(ur ...
- 【ThinkPHP学习】ThinkPHP自己主动转义存储富文本编辑器内容导致读取出错
RT. ThinkPHP的conf文件里的Convention.php有一个配置选项 'DEFAULT_FILTER' => 'htmlspecialchars', // 默认參数过滤方法 用于 ...
- CentOS 安装nload(流量统计)
yum install gcc gcc-c++ ncurses-devel wget http://www.roland-riegel.de/nload/nload-0.7.2.tar.gz tar ...
- C# Socket服务端和客户端互相send和receive
服务端 { ]; ; { ...
- Sql遍历数据库
Sql遍历数据库 set nocount on ) ) ) set @str='ad' Declare cur_Depart Cursor For select name,id from syscol ...
- C# @字符用法
1.用 @ 符号加在字符串前面表示其中的转义字符“不”被处理. 如果我们写一个文件的路径,例如"D:/文本文件"路径下的text.txt文件,不加@符号的话写法如下: string ...
- Mschart应用之曲线图表spline
本文主要是Mschart应用之曲线图表spline,实现6个模拟数据的图表,其中数据源X轴为当前系统时间,Y轴是由随机函数产生的不同范围的随机数. 首先是自定义一个数据表,然后产生的数据添加到该数据表 ...
- 跳跃表 C#
虽然avl树和红黑树在数据搜索和排序方面都是有效的数据结构,但是都显得特别麻烦,跳跃表就显得特别简单,虽然简单 不影响他性能,在平均情况下,其插入.删除.查找数据时间复杂度都是O ...