strlen函数实现
strlen是计算机C语言函数,计算字符串s的(unsigned int型)长度,不包括‘\0‘在内。strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符‘\0‘为止,然后返回计数器值。
1.1 数组
int my_strlen(char s[]) { int i = 0; while (s[i] != ‘\0‘) { i++; } return i; }
1.2 指针
//普通指针做法 int my_strlen(const char* str) { assert(str);//断言 int count=0; while (*str) { count++; str++; } return count; }
//指针减指针得到两指针之间元素个数(仅限同一数组两指针) int my_strlen(const char *str) { assert(str); const char*p = str;//p为起始位置 while (*str) { str++; } return str - p; }
//在C语言库中(即指针减指针) size_t _cdecl strlen(const char* str) { const char *eos = str; while (*eos++); return (eos - str - 1); }
2. strstr函数实现
strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。该函数是二进制安全的。
char* my_strstr(char* str1, char* str2) { assert(str1); assert(str2); char* ptr = str1; while (*ptr) { char *p1 = ptr; char *p2 = str2; while (*p2==*p1) { p1++; p2++; if (*p2 == ‘\0‘) return ptr; } ptr++; } }
3. strcpy函数实现
它复制以null为退出字符的存储区区块到另一个存储器区块内。由于字符串在C语言不是首要的数据型态,而是以实现的方式来替代,在存储器内以连续的字节区块组成,strcpy 可以有效复制两个配置在存储器以指针回传的字符串(字符指针或是字符串指针)
//原 void my_strcpy(char* str1, const char* str2) { assert(str1);//检测指针有效性 assert(str2); while (*str2) { *str1 = *str2; str1++; str2++; } *str1 = ‘\0‘; }
//优化*1 void my_strcpy(char* str1,const char* str2) { assert(str1); assert(str2); while (*str1++ = *str2++)//简化代码 { ; } }
//优化*2 ///需要链式访问将void换成char*,函数的返回值作为另一个函数的参数 char* my_strcpy(char* str1, const char* str2) { assert(str1); assert(str2); char* ret = str1; while (*str1++ = *str2++) { ; } return ret; }
ps:附strncpy函数实现,从str2中复制n个字符到str1中
void my_strncpy(char* str1, const char* str2, int count) { assert(str1); assert(str2); while (count) { *str1 = *str2; count--; } }
4. strcmp函数实现
字符串比较函数,两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇‘\0‘为止
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; }
//方法二
int my_strcmp(const char*str1, const char*str2) { assert(str1); assert(str2); while (*str1 == *str2) { if (*str1 == ‘\0‘) { return 0; } str1++; str2++; } if (*str1 - *str2 > 0) { return 1; } else { return -1; } }
5. strcat函数实现
strcat是连接字符串的函数。函数返回指针,两个参数都是指针,第一个参数所指向的内存的地址必须能容纳两个字符串连接后的大小。
char* my_strcat(char* str1,const char* str2) { assert(str1); assert(str2); char *ret = str1; while (*str1) { str1++; } while (*str1++ = *str2++) { ; } return ret; }
本文出自 “无以伦比的暖阳” 博客,请务必保留此出处http://10797127.blog.51cto.com/10787127/1718349
原文地址:http://10797127.blog.51cto.com/10787127/1718349