C语言 模拟实现字符串操作的库函数
求字符串长度 strlen
思路
1.如果碰到\0就代表字符串已经到了末尾
size_t my_strlen(const char* str)
{
assert(str!=NULL);
//指针版本
/*const char* start = str;
const char* end = str;
while (*end!='\0')
{
end++;
}
return end-start;*/
//递归实现
if (*str == '\0')
{
return 0;
}
return 1 + my_strlen(str+1);
}
字符串拷贝函数 strcpy实现
char* my_strcpy(char* dist, const char* source)
{
assert(dist && source);
char* ret = dist;
while ((*dist++ = *source++)!='\0')
{
;
}
return ret;
}
char* my_strncpy(char* dist,const char* source,size_t num)
{
// 存储dist首地址
char* start = dist;
// 1.如果num为0 不需要拷贝
// 2.如果拷贝的到source \0 结束拷贝
while (num && (*dist++ = *source++) != '\0')
{
// 每拷贝一个字符 减一次
num--;
}
//如果没拷贝完num个 继续拷贝 末尾追加\0
if (num)
{
while (--num)
{
*dist = '\0';
}
}
return start;
}
字符串拼接函数 strcat strncat
//修改了值的过程 dist一直在++ 指向的就不是原起始地址
char* my_strcat(char* dist, const char* source)
{
//注意:保留目标字符串的开始地址
char* ret = dist;
assert(dist && source);
//1.找到目标字符串的\0
while (*dist)
{
dist++;
}
//2.追加源字符串,包含\0
while ((*dist++ = *source++)!='\0')
{
;
}
return ret;// 返回目标空间的起始地址
}
//手动添加\0
char* my_strncat(char* dist, char* source, size_t num)
{
assert(dist && source);
char* start = dist;
// 知道目标字符串的\0 才可以开始拷贝
// 会跳过\0
while (*dist++)
{
;
}
dist--;
while (num--)
{
if ((*dist++ = *source++) == 0)
return start;
}
*dist = '\0';
return start;
}
字符串比较函数 strcmp strncmp
int my_strcmp(const char* dist, const char* source)
{
//判断指针有效性
if (dist == NULL || source == NULL)
{
return NULL;
}
//1.每个对应字符比较
while (*dist == *source)
{
//相等才会进来判断 如果目标字符串到\0 则source也是\0
if (*dist == '\0')
return 0;
//++ 进行下个字符比较
dist++;
source++;
}
//比较大小 返回
/*if (*dist > *source)
{
return 1;
}
else
{
return -1;
}*/
//return *dist > *source ? 1 : -1;
return dist - source;
}
int my_strncmp(const char* dist,const char* source,size_t num)
{
assert(dist && source);
//判断是否有字符比较
if (!num)
{
return 0;
}
//条件比较字符个数--
// 目标字符为\0
// 结合性从左到右
while (--num && *dist &&(*dist == *source))
{
dist++;
source++;
}
return *dist - *source;
}
字符串求包含字串函数 strstr
char* my_strstr(const char* dist, const char* source)
{
assert(dist && source);
const char* s1 = NULL;
const char* s2 = NULL;
// 记录起始位置
const char* p = dist;
//要查找的字符串为\0 空 返回dist
if (!*source)
{
return (char*)dist;
}
while (*p != '\0')
{
// 回到起始位置
s1 = p;
s2 = source;
//相等继续往后走 判断
//前提 s1已经找完 大于等于s2
//s2找完 s1不包含字串
while (*s1 && *s2 && (*s1 == *s2))
{
s1++;
s2++;
}
//判断s2是否已经判断完了
if (*s2 == '\0')
{
return (char*)s2;
}
//如果不相等 往后加1
p++;
}
return NULL;
}
标签:dist,++,C语言,char,source,字符串,return,模拟,const
From: https://www.cnblogs.com/worker618/p/16853072.html