自己实现字符串函数
求字符串长度strlen——Mystrlen
int Mystrlen(char *des)
{
int count = 0; //计算器
for(int i=0;*(des+i)!='\0';i++)
{
count++;
}
return count;
}
字符串复制strcpy——Mystrcpy
void Mystrcpy(char des[],char src1[]) //复制str1到str2
{
int i;
for(i=0;src[i]!='\0';i++)
{
des[i] = src[i];
}
str2[i] = '\0';
}
进阶:指针
void Mystrcpy1(char *des,const char *src)
{
int i;
for(i=0;*(src+i)!='\0';i++)
{
*(des+i) = *(src+i);
}
*(des+i) = '\0';
}
void Mystrcpy2(char *des,const char *src)
{
while(*src!='\0')
{
*des = *src;
src++;
des++;
}
*des= '\0';
}
经典代码
技巧:1.赋值的定义:将等式右边的值作为整个表达式的值
2.优先级
3.空语句;
4.后置++
5.利用非0为真,0为假使循环继续或停止
void Mystrcpy(char *des,const char *src)
{
while(*des++ = *src++);
}
加入断言
void Mystrcpy(char *des,const char *src)
{
assert(des!=NULL && src!=NULL);
if(des==NULL || src==NULL)
{
return ;
}
while(*des++ = *src++);
}
字符串连接strcat——Mystrcat
void Mystrcat(char *des,const char *src)
{
//找到des的尾巴
int i;
for(i=0;des[i]!='\0';i++)
;//空语句
//复制src
for(int j=0;src[j]!='\0';j++,i++)
{
des[i] = src[j];
}
des[i] = '\0';
}
字符串比较strcmp——Mystrcmp
//比较字符串大小.str1>str2返回正数;str1==str2返回0;str1<str2返回负数
int Mystrcmp(char str1[],char str2[])
{
int i=0;
int d;
for(;str1[i]||str2[i];i++)
{
if(str1[i] != str2[i])
{
d=str1[i] - str2[i];
break;
}
}
if(str1[i] == '\0'&&str2[i] == '\0') //比较到末尾还没break
d=0;
return d;
}
指针形式:
int Mystrcmp(char const *str1,char const *str2)
{
int i=0;
int d;
for(i=0;*(str1+i)||*(str2+i);i++)
{
if(*(str1+i)!=*(str2+i))
{
d=*(str1+i) - *(str2+i);
break;
}
}
if(*(str1+i)=='\0'&&*(str2+i)=='\0')
d=0;
return d;
}
更简洁的版本:
nt Mystrcmp(const char *str1,const char *str2)
{
assert(str1!=NULL && str2!=NULL);
int tmp;//用来保存两个字符差值
while((tmp=*str1-*str2)==0 && *str1!='\0')
{
str1++;
str2++;
}
return tmp;
}
字符串反序
void Reverse(char *str)
{
char *p;
char tmp;
for(p=str;*p!='\0';p++)//找尾巴
;
for(p--;str<p;str++,p--)//交换数据
{
tmp = *str;
*str = *p;
*p = tmp;
}
}
字符串转为数字Myatoi
//将字符串转成数字 "123"->123,"123a4"->123,"a123"->0
//1.字符串最前面的空格自动忽略;
//2.能处理最前面的符号
//3.遇到非数字字符转换结束;
//4.数字超过范围,就只保留最大或者最小值
int Myatoi(const char *str)
{
assert(str != NULL);
int flg = 1;//符号
int tmp = 0;
while(*str == ' ')//1.字符串最前面的空格自动忽略
str++;
if(*str=='+')//2.能处理最前面的符号
str++;
else if(*str=='-')
{
flg = -1;
str++;
}
while(isdigit(*str))//只处理数字字符 .'1'->1,'2'->2,'3'->3,'4'->4... ; 'i'-'0'->i
{//"123"->1,2,3
tmp = tmp*10 + (*str - '0');
str++;
}
return flg*tmp;
}
数字转为字符串Myitoa
//将数字转成字符串 12345->"12345"
//12345->"54321"->"12345"
void Myitoa(char *buf,int num)
{
int i = 0;//buf的下标
do
{
buf[i++] = num%10 + '0';//将个位数字转成字符,保存
num /= 10;//丢弃个位
}while(num != 0);
buf[i] = '\0';
Reverse(buf);//反转
}