strlen函数
strlen函数的实现
size_t strlen ( const char * str );
第一种方法:
#include<stdio.h>
#include<assert.h>
int my_strlen(const char* arr)
{
int count=0;
assert(arr);//assert(arr!=NULL)
while(*arr!='\0')//while(arr)
{
count++;
arr++;
}
return count;
}
int main()
{
char arr[ ]="abcdefg";
int ret=0;
ret=my_strlen(arr);
printf("%d\n",ret);
}//编译结果:7
第二种方法(递归)
#include<stdio.h>
int my_strlen(char* arr)
{
if(*arr=='\0')
{
return 0;
}
else
{
return (1+my_strlen(arr+1));
}
}
int main()
{
char arr[]="abcdefgggggg";
int ret=0;
ret=my_strlen(arr);
printf("%d\n",ret);
}
注意实现
1、 字符串以'\0' 作为结束标志,strlen函数返回的是在字符串中'\0' 前面出现的字符个数(不包
含'\0' )。
2、参数指向的字符串必须要以'\0' 结束。
3、注意函数的返回值为size_t,是无符号的( 易错)
#include <stdio.h>
#include<string.h>
int main()
{
const char*str1 = "abcdef";
const char*str2 = "bbb";
if(strlen(str2)-strlen(str1)>0)
{
printf("hehe\n");
}
else
{
printf("haha\n");
}
return 0;
}//编译结果:hehe 返回值是-3,但是是返回无符号数,因此-3要变成正数
strcpy函数
strcpy函数的实现
char* strcpy(char * destination, const char * source );
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcpy(char* arr1,const char* arr2)
{
char* ret=NULL;
assert(arr1 && arr2);
ret=arr1;
while(*arr1++=*arr2++)
{
;
}
return ret;
}
int main()
{
char arr1[]="abcdefg";
char arr2[]="world";
printf("%s\n",my_strcpy(arr1,arr2));
return 0;
}//编译结果:world
注意事项
1、源字符串必须以'\0'结束。
2、会将源字符串中的'\0' 拷贝到目标空间。
3、目标空间必须足够大,以确保能存放源字符串。
4、目标空间必须可变。
strcmp函数
strcmp函数的实现
int strcmp ( const char * str1, const char * str2 );
#include<stdio.h>
#include<assert.h>
#include<string.h>
int my_strcmp(const char* arr1,const char* arr2)
{
assert(arr1&&arr2);
while(*arr1==*arr2)
{
if(*arr2=='\0')
{
return 0;//相等
}
arr1++;
arr2++;
}
/*if(*arr1>*arr2)
{
return 1;
}
else
{
return -1;
}*/ //适合C语言编译器
return (*arr1-*arr2);//适用于大部分编译器
}
int main()
{
char arr1[]="abc";
char arr2[]="abcdfge";
int ret1=0;
int ret2=0;
ret1=strcmp(arr1,arr2);
ret2=my_strcmp(arr1,arr2);
printf("%d\n",ret1);
printf("%d\n",ret2);
}//编译结果:-1
注意事项
1、第一个字符串大于第二个字符串,则返回大于0的数字
2、第一个字符串等于第二个字符串,则返回0
3、第一个字符串小于第二个字符串,则返回小于0的数字
strncpy函数
strncpy函数的实现
char * strncpy ( char * destination, const char * source, size_t num );
#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strncpy(char* arr1,char* arr2,int count)
{
char* ret=arr1;
while(count && *arr1++ == *arr2++)
{
count--;
}
for(;count>0;count--)
{
*arr1++='\0';
}
return ret;
}
int main()
{
char arr1[]="abcdefghijk";
char arr2[]="maya";
printf("%s\n",strncpy(arr1,arr2,3));
printf("%s\n",my_strncpy(arr1,arr2,3));
}
注意事项
1、拷贝num个字符从源字符串到目标空间。
2、如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
strncat函数
strncat函数的实现
#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strncat(char* arr1,const char* arr2,int k)
{
char* ret=arr1;
while(*arr1++)
{
;
}
arr1--;
while(k--)
{
*arr1++=*arr2++;
}
*arr1='\0';
return ret;
}
int main()
{
char arr1[30]="ranshaozijiba";
char arr2[]="wohaikeyi";
//printf("%s\n",strncat(arr1,arr2,9));
printf("%s\n",my_strncat(arr1,arr2,9));
return 0;
}
注意事项
1、会在目标字符串中加入'\0'
2、要复制的字符串数量大于源字符串的数量,则只复制源字符串的数量,并不会在后面补齐'\0'。