您的位置:首页 > 其它

某些库函数的模拟实现(一)

2016-04-13 22:30 381 查看
模拟实现以下函数:strcpy()函数~strcat()函数~strstr()函数~strlen()函数

1.strcpy()函数模拟

#include<assert.h>
char * my_strcpy(char *dest, const char *src)
{
char *ret = dest;
assert(dest);
assert(src);
while (*dest++ = *src++)
{
;
}
return ret;

}
需要注意的地方:(1).记着复制\0

(2).第二个参数用const来修饰~防止复制过程中两个串写反而在编译过程中检查不出来~

(3)有返回值~

2.strcat()函数模拟:

<pre name="code" class="objc">char *my_strcat(char *dest, const char *src)
{
char *ret = dest;
assert(dest);
assert(src);
while (*dest)
{
++dest;
}
while (*dest++ = *src++)
{
;
}
return ret;
}



两个函数比较相似~都需要注意到的是,不管是复制还是连接,在之前,都需要将dest串保存起来,防指最后指向结束符字符串无法输出~3.strlen()函数模拟:
int my_strlen(const char *str)
{

if (*str != '\0')
return 1 + my_strlen(str+1);
else return 0;
}
由于非递归实现比较简单,这里就不给出代码~~

4.strstr()模拟实现

<pre name="code" class="objc">char *mathed(const char *str, const char *substr)
{

const char *str1 = str;
const char *str2 = substr;
const char *start = NULL;
assert(str);
assert(substr);
while (*str1 != '\0')
{
start = str1;
while (*str1 && *str2)
{
if (*str1 == *str2)
{
str1++;
str2++;
}
else
break;
}
/*while (*str1 && *str2 && *str1 == *str2)
{
str1++;
str2++;
}*/

if (*str2 == '\0')
{
return (char *)start;
}

str1 = start + 1;
str2 = substr;

}
return NULL;
}
int main()
{
char *str = NULL;
str = mathed("abcdde","bbcd");
if (str != NULL)
{
printf("%s", str);
}
else
{
printf("match fail");
}
system("pause");
return 0;
}


分析:strstr函数的功能是找到原串中是否可以找到子串,如果可以,返回从子串开始地方的指针~

这个就有点类似kmp算法,当原串和子串的字符相等 ,两串分别向后移动一,若子串指向结束符,说明找到了,如果子串没有指向结束符,并且指针所指向字符不等,此时子串指向开始地方,原串指向上次开始地方的下一个位置~当原串指向结束符,说明找不到了~~
屏蔽的while循环和与它最近的while循环等价,屏蔽的while结构更清晰,未屏蔽的,则需要注意if和else配套使用,不然会出现意想不到的结果~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: