字符串相关函数的模拟实现-创新互联
要模拟库函数的实现,必须要搞清楚的是在程序调用中它的实现原理是什么,接下来就讲解几个字符串相关的函数,比如strcmp(),strncmp(),strcat(),strncat()......
我们提供的服务有:网站建设、成都网站制作、微信公众号开发、网站优化、网站认证、红花岗ssl等。为上千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的红花岗网站制作公司字符串函数主要包括受限制字符串函数与不受限制字符串函数,那么什么是受限制字符串函数与不受限制字符串函数呢?!简单来讲,不受限制字符串函数就是使用这些函数时,它们只是通过字符串结尾的NULL 字符来确定字符串的长度,例如我们常用的strcmp(),strcpy();而受限制的字符串函数就是这些函数她们接受一个显示的长度参数,来限定要复制或者比较的字符个数,例如strncmp(),strncpy(),这里边的n在函数名和函数传参中都有,n即为要操作的字符个数。
一、不受限制字符串函数
1.strcpy()
库函数原型:char*strcpy(char*strDestination,constchar*strSource);
实现:将拷贝的字符串str2一个一个拷贝到字符数组str1中,直到字符数组遇到‘\0’结束标志后拷贝完成。在拷贝时,str2中的'\0'一同被拷贝。
char *my_strcpy(char *str1,const char *str2) { char *start = str1; //保存字符数组2的首地址 assert(str1); assert(str2); while(*str1++ = *str2++) { ; } return start; }
2.strlen()
库函数原型:size_tstrlen(constchar*string);
实现:在遇到'\0'之前,指针每向后挪动一次,计数器加一次
int my_strlen(const char *str1) { int count = 0; assert(str1); while(*str1++) { count++; //str1++; } return count; }
3.strcmp()
库函数原型:intstrcmp(constchar*string1,constchar*string2);
比较规则:两个字符串自左向右逐个字符比较(按ASCII码的值比较),知道出现不同的字符或者遇到‘\0’。
(1)如果字符全部相等,则两个字符串相等;
(2)如果出现不同的字符,则以第一对不相同字符的比较结果为准。
比较的结果由函数值带回:
(1)字符串1 = 字符串2,返回0;
(2)字符串1 > 字符串2 ,返回一个正整数;
(3)字符串1 < 字符串2,返回一个负整数。
int my_strcmp(const char *str1,const char *str2) { assert(str1); assert(str2); while(*str1 == *str2) { if(*str1 != '\0') return 0; str1++; str2++; } return *str1 - *str2; }
4.strcat()
库函数原型:char*strcat(char*strDestination,constchar*strSource);
实现:指针指到字符数组1 的结尾时,将字符串2 中的字符一个一个追加到字符数组1 的后面,指针向后挪一次,字符拷贝一个,直到字符数组1 遇到‘\0’时追加完毕。(字符数组1 要足够大,能把字符串2 都添加进去)
char *my_strcat(char *str1,const char *str2) { char *start = str1; //保存字符数组的首地址 assert(str1); assert(str2); while(*str1) { str1++; } while(*str2) { *str1 = *str2; str1++; str2++; } *str1 = '\0'; return start; }
5.strstr()
库函数原型:char*strstr(constchar*string,constchar*strCharSet);
实现:在字符串str1 中找子字符串str2,如果能找到,就返回子串的起始位置,如果找不到,就返回NULL
char *my_strstr(const char *str, const char *substr) { const char *str1 = str; const char *str2 = substr; const char *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; } return NULL; }
二、受限制字符串函数
1.strncat()
原型:char*strncat(char*strDest,constchar*strSource,size_tcount);
count为要追加的字符个数
char *my_strncat(char *str1,char *str2,size_t n) { char *start = str1; //保存字符数组1 的起始地址 assert(str1); assert(str2); while(*str1) { str1++; } while(n) { *str1 = *str2; str1++; str2++; n--; } *str1 = '\0'; return start; }
2.strncmp()
函数原型:char*strncpy(char*strDest,constchar*strSource,size_tcount);
int my_strncmp(const char *str1,const char *str2,size_t n) { assert(str1); assert(str2); while(n && *str1 && *str1 == *str2) { if(*str1 != '\0') return 0; str1++; str2++; n--; } return *str1 - *str2; }
3.strncpy()
库函数原型:char*strncpy(char*strDest,constchar*strSource,size_tcount);
char *my_strncpy(char *str1,char *str2,size_t n) { char *start = str1; assert(str1); assert(str2); while((n--) && (*str1++ = *str2++)) { //*str1++ = *str2++; //n--; } *str1 = '\0'; return start; }
创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。
名称栏目:字符串相关函数的模拟实现-创新互联
URL链接:http://pwwzsj.com/article/didjei.html