#include <iostream>
#include <assert.h>
#include <string.h>
using namespace std;
#define size_t unsigned int
//求字符串长度
int my_strlen(char const *str)
{
int count = 0;
while(*str != '\0')
{
count++;
str++;
}
return count;
}
//不使用中间变量 --递归求解
int my_strlen( const char* strDest )
{
assert(NULL != strDest);
if ('\0' == *strDest)
{
return 0;
}
else
{
return (1 + my_strlen(++strDest));
}
//return (*strDest!='\0') ? (1+my_strlen(++strDest)<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">)</span><span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;"> : 0;</span>
}
//字符串拷贝
char* my_strcpy(char *dst,char const* src)
{
assert((dst!=NULL) && (src!=NULL));
char *temp = dst; //用temp保存dst的初始指向
// while(*src != '\0')
// {
// *dst++ = *src++;
// }
// *dst = '\0';
while((*dst++ = *src++) != '\0');
return temp; //返回dst的初始指向
}
//字符串连接
char *my_strcat(char* dst,const char* src)
{
assert(dst!=NULL && src!=NULL);
char *temp = dst; //用temp保存dst的初始指向
while(*dst != '\0')
dst++;
while(*src != '\0') //src连接在dst后面,覆盖dst的'\0'
*dst++ = *src++;
*dst = '\0'; //连接后的dst补'\0'
return temp;//返回dst的初始指向
}
//字符串比较大小
int my_strcmp(char const *s1,char const*s2)
{
assert(s1!=NULL && s2!=NULL);
while(*s1!='\0' && *s2!='\0' && *s1==*s2)
{
s1++;
s2++;
}
if(*s1 < *s2) //如果ASCII(*s1<*s2) 返回小于0的值
return -1;
else if(*s1 > *s2)
return 1; //
else
return 0;
}
//拷贝len个字符
char *my_strncpy(char *dst,char const *src,size_t len)
{
char *temp = dst;
if(len < strlen(src)) //拷贝长度 < src长度
for(int i=len; i>=0; --i) //拷贝len个字符串
{
*dst++ = *src++;
}
else
{
while(*src != '\0')
{
*dst++=*src++;
}
*dst = '\0'; //拷贝strlen(src)个长度到dst
while(int count=(len-strlen(src)) <= 0) //继续用'\0'拷贝
{
*dst = '\0';
count--;
}
}
return temp;
}
//连接len个字符串
char *my_strncat(char *dst,char const *src,size_t len)
{
assert(dst!=NULL && src!=NULL);
char *temp = dst;
while(*dst != '\0')
dst++;
if(len < strlen(src))
{
for(int i=len; i>=1; --i)
{
*dst++ = *src++;
}
}
else
while(*src != '\0')
*dst++ = *src++;
*dst = '\0';
return temp;
}
//分别比较s1,s2的前len个字符串
int my_strncmp(char const *s1,char const *s2,size_t len)
{
assert(s1!=NULL && s2!=NULL);
int i=1;
while(*s1!='\0' && *s2!='\0' && *s1==*s2 && i<len) //比较len-1次
{
s1++;
s2++;
i++;
}
//长度为第len个的字符
if(*s1 < *s2)
return -1;
else if(*s1 > *s2)
return 1;
else
return 0;
}
//在一个字符串中一个字符第一次出现的位置
char *my_strchr(char *str,int ch)
{
assert(str != NULL);
// char *temp = (char *)str;
while(*str != '\0' && *str!=ch)
str++;
if(*str == ch)
return str;
else
<span style="white-space:pre"> </span>return NULL;
}
//在一个字符串中一个字符最后出现的位置
char *my_strrchr(char const *str,int ch)
{
assert(str != NULL);
char *p = (char *)str;
while(*str != '\0')
str++;
while(str--!=p && *str!= ch);
// while(str != p && *str!=ch)
// str--;
if(*str == ch)
return (char *)str;
return NULL;
}
//在一个字符串中查找任何一组字符第一次出现的位置
char *my_strpbrk(char const *str,char const *group)
{
assert(str!=NULL && group!=NULL);
char *temp1 = (char*)group; //group的指针可能会变化,用*temp1保存group的起始位置
while(*str != *group && *str!='\0')
{
group++;
if(*group == '\0') // 用*str和group的每个字符比较
{
str++;
group = temp1;
}
}
return (char*)str;
}
//在一个字符串中查找一个子串第一次出现的起始位置,返回一个位置的指针
//如果s2没有完整地出现在s1中,则返回NULL指针
//如果第二个参数是空字符串,则函数返回s1
char *my_strstr(char const *s1,char const *s2)
{
assert(s1 != NULL);
char *temp = (char*)s2;
if(s2 != NULL)
{
while(*s1!='\0' && *s2!='\0')
{
while(*s1 != *s2)
{
s1++;
s2 = temp; //更改s2的指针,重新指向首字母
}
s1++; //判等了,s1++,s2++在判断 若不等,则s2变为初始指向
s2++;
}
return (strcat(temp,(char*)s1));
}
else
return (char*)s1;
}