字符串函数:
如何自己编写strlen,strcpy, strcat, strcmp, atoi , itoa
1.
strlen:计算字符串长度.
它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。
int Mystrlen(const char *str)
{
assert(str != NULL);//不可以传空指针
int i = 0;
while(*str!='\0')//遇'\0'时结束
{
i++;
str++;
}
return i;//字符串有效长度,不包含'\0'
}
2.
strcpy:字符串复制.
把src中的字符一个一个复制到des中
void Mystrcpy(char *des,char *src)
{
int i;
for(i=0;src[i]!='\0';i++)
{
des[i] = src[i]; // 也可以表示成:*(des+i) = *(src+i),复制
}
des[i] = '\0';//标志字符串复制结束
}
3.
strcat:字符串的连接.
把src所指字符串添加到des结尾处(覆盖des结尾处的'\0')实现字符串的连接。
char * Mystrcat(char *des,const char *src)
{
assert( des != NULL && src != NULL);//断言不为空串
if(des == NULL || src == NULL)
{
return des;
}
char *p =des;
while( *des != '\0')
{
des++;//找到des的尾
}
while( *src != '\0')
{
* des++ = *src++;//字符串的连接
}
return p;//返回目的地指针des
}
4,
strcmp:字符串的大小比较.
设这两个字符串为str1,str2,若str1==str2,则返回零;若str1str2,则返回正数。
int Mystrcmp(const char *str1 ,const char *str2)
{
assert(str1 != NULL && str2 != NULL);
int tmp;
while((tmp=*str1 -*str2)==0)
{
str1++;
str2++;
}
if(tmp>0)
{
return 1;
}
if(tmp==0)
{
return 0;
}
if(tmp<0)
{
return -1;
}
return tmp;
}
5.
atoi:字符串转换成整形数的一个函数
“123”->123,"1a23"->1,"a123"->0
int Myatoi(const char *str)
{
int tmp =0;
while(isdigit(*str)) //isdigit是一个判断是否是数字的函数
{
tmp=tmp*10+(*str -'0');//每个数的ASCII码为(n-'\0'),tmp*10增高位数即1->12->123
str++;
}
return tmp;
}
6.
itoa 取整数输入值,并将其转换为相应进制数字的字符串
123->"123"
char * Myitoa(char *str,int num)
{
int tmp=0;
int count = 0;
char *p = str;
int y;
while(num!=0)
{
tmp=num; //依次取下3 ,2,1.
num/=10;//降低位数 即;123->12->1
*str++= tmp+'0';//字符串中数字对应的ASCII码为('\0'+n)
count++; //统计次数
}
*str= '\0'; // 字符串以'\0'结尾
str--;
for(y = 0;y < count/2;y++) //字符串的逆置
{
tmp = *(str - y);
*(str - y) = *(p + y);
*(p + y) = tmp;
}
return p;
}
