strlen
方式一(计数器):
# define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<assert.h> int my_strlen(const char*str) { int count = 0; assert(str); while (*str) { str++; count++; } return count; } int main() { char str[] = "abcdf"; printf("%d ", my_strlen(str)); return 0; }
方式二(迭代):
# define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<assert.h> int my_strlen(const char*str) { int count = 0; assert(str); if (*str == '\0') { return 0; } else return 1 + my_strlen(str + 1); } int main() { char str[] = "abcdf"; printf("%d ", my_strlen(str)); return 0; }
方法三:
指针运算
# define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<assert.h> int my_strlen(char*s) { assert(s); char* p = s; while (*p != '\0') p++; return p-s; } int main() { char str[] = "abcdf"; printf("%d ", my_strlen(str)); return 0; }
strcpy
原字符串里必须有‘\0’。
会将源字符串中的 '\0' 拷⻉到⽬标空间。
目标空间必须可修改:char*p="xxxxxx";是常量字符串,不可被修改。
void my_strcpy(char* dest, const char* src) { assert(src!=NULL); assert(dest!=NULL); while(*src!='\0') { *dest = *src;//拷贝\0之前的内容 dest++; src++; } *dest = *src;//拷贝\0 }
第一次修改后:
void my_strcpy(char* dest, const char* src) { assert(src!=NULL); assert(dest!=NULL); while(*src!='\0') { *dest++ = *src++;//拷贝\0之前的内容 } *dest = *src;//拷贝\0 }
第二次修改后:
后置++的优先级高,但是结果是后产生的。
void my_strcpy(char* dest, const char* src) { assert(src!=NULL); assert(dest!=NULL); while(*dest++ = *src++) { ; } }
\0的asc码值为0,拷不过去。
模拟实现返回类型为char,对本代码再次进行修改:
char my_strcpy(char* dest, const char* src) { assert(src!=NULL); assert(dest!=NULL); char*ret=dest; while(*dest++ = *src++) { ; } return ret;//返回目标空间的起始地址 }
strcat
用来连接字符串
首先找到目标空间的\0(如果没有,不知道追加从哪儿开始),再拷贝数据。源字符串也必须以\0结尾,不然不知道什么时候结束。目标空间必须足够大且能够修改。
char* my_strcat(char* dest, const char* src) { char* ret = dest;//记录原字符串的头指针 assert(dest != NULL); assert(src != NULL); while (*dest)//找到原字符串\0的下一位 { dest++; } while ((*dest++ = *src++)) { ; } return ret; }
strcmp
int my_strcmp(const char* str1, const char* str2) { int ret = 0; assert(src != NULL); assert(dest != NULL); while (*str1 == *str2) { if (*str1 == '\0') return 0; str1++; str2++; } return *str1 - *str2; }
strstr
# define _CRT_SECURE_NO_WARNINGS #include<stdio.h> char* my_strstr(const char* str1, const char* str2) { const char* s1 = NULL; const char* s2 = NULL; const char* cur = str1; while (*cur) { s1 = cur; s2 = cur; while(*s1!='\0'&&*s2!='\0'&&*s1 == *s2) { s1++; s2++; } if(*s2=='\0') { return cur; } cur++; } return NULL;//找不到就返回空指针 }