字符串相关函数的模拟实现
要模拟库函数的实现,必须要搞清楚的是在程序调用中它的实现原理是什么,接下来就讲解几个字符串相关的函数,比如strcmp(),strncmp(),strcat(),strncat()......
字符串函数主要包括受限制字符串函数与不受限制字符串函数,那么什么是受限制字符串函数与不受限制字符串函数呢?!简单来讲,不受限制字符串函数就是使用这些函数时,它们只是通过字符串结尾的NULL 字符来确定字符串的长度,例如我们常用的strcmp(),strcpy();而受限制的字符串函数就是这些函数她们接受一个显示的长度参数,来限定要复制或者比较的字符个数,例如strncmp(),strncpy(),这里边的n在函数名和函数传参中都有,n即为要操作的字符个数。
一、不受限制字符串函数
1.strcpy()
库函数原型:char *strcpy( char *strDestination, const char *strSource );
实现:将拷贝的字符串str2一个一个拷贝到字符数组str1中,直到字符数组遇到‘\0’结束标志后拷贝完成。在拷贝时,str2中的'\0'一同被拷贝。
char*my_strcpy(char*str1,constchar*str2){char*start=str1;//保存字符数组2的首地址assert(str1);assert(str2);while(*str1++=*str2++){;}returnstart;}
2.strlen()
库函数原型:size_t strlen( const char *string );
实现:在遇到'\0'之前,指针每向后挪动一次,计数器加一次
intmy_strlen(constchar*str1){intcount=0;assert(str1);while(*str1++){count++;//str1++;}returncount;}
3.strcmp()
库函数原型:int strcmp( const char *string1, const char *string2 );
比较规则:两个字符串自左向右逐个字符比较(按ASCII码的值比较),知道出现不同的字符或者遇到‘\0’。
(1)如果字符全部相等,则两个字符串相等;
(2)如果出现不同的字符,则以第一对不相同字符的比较结果为准。
比较的结果由函数值带回:
(1)字符串1 = 字符串2,返回0;
(2)字符串1 > 字符串2 ,返回一个正整数;
(3)字符串1 < 字符串2,返回一个负整数。
intmy_strcmp(constchar*str1,constchar*str2){assert(str1);assert(str2);while(*str1==*str2){if(*str1!='\0')return0;str1++;str2++;}return*str1-*str2;}
4.strcat()
库函数原型:char *strcat( char *strDestination, const char *strSource );
实现:指针指到字符数组1 的结尾时,将字符串2 中的字符一个一个追加到字符数组1 的后面,指针向后挪一次,字符拷贝一个,直到字符数组1 遇到‘\0’时追加完毕。(字符数组1 要足够大,能把字符串2 都添加进去)
char*my_strcat(char*str1,constchar*str2){char*start=str1;//保存字符数组的首地址assert(str1);assert(str2);while(*str1){str1++;}while(*str2){*str1=*str2;str1++;str2++;}*str1='\0';returnstart;}
5.strstr()
库函数原型:char *strstr( const char *string, const char *strCharSet );
实现:在字符串str1 中找子字符串str2,如果能找到,就返回子串的起始位置,如果找不到,就返回NULL
char*my_strstr(constchar*str,constchar*substr){constchar*str1=str;constchar*str2=substr;constchar*start=NULL;assert(str);assert(substr);if(*str2=='\0')return(char*)str1;while(*str1){start=str1;//找到的第一个字符保存while(*str1&&*str2&&*str1==*str2){str1++;str2++;}if(*str2=='\0')return(char*)start;str1=start+1;str2=substr;}returnNULL;}
二、受限制字符串函数
1.strncat()
原型:char *strncat( char *strDest, const char *strSource, size_t count );
count为要追加的字符个数
char*my_strncat(char*str1,char*str2,size_tn){char*start=str1;//保存字符数组1的起始地址assert(str1);assert(str2);while(*str1){str1++;}while(n){*str1=*str2;str1++;str2++;n--;}*str1='\0';returnstart;}
2.strncmp()
函数原型:char *strncpy( char *strDest, const char *strSource, size_t count );
intmy_strncmp(constchar*str1,constchar*str2,size_tn){assert(str1);assert(str2);while(n&&*str1&&*str1==*str2){if(*str1!='\0')return0;str1++;str2++;n--;}return*str1-*str2;}
3.strncpy()
库函数原型:char *strncpy( char *strDest, const char *strSource, size_t count );
char*my_strncpy(char*str1,char*str2,size_tn){char*start=str1;assert(str1);assert(str2);while((n--)&&(*str1++=*str2++)){//*str1++=*str2++;//n--;}*str1='\0';returnstart;}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。