📘str
💶strlen - 求字符串长度
法一. count计数
size_t my_strlen(char* str) { assert(str); unsigned int count = 0; while (*str != '\0') { count++; str++; } return count; }
法二. 递归
字符串长度 = 1 + 刨去第一个字符的剩下字符串的长度
即↓
unsigned int my_strlen(char* str) { assert(str); if (*str != '\0') return 1 + my_strlen(str + 1); else return 0; }
法三. 指针 - 指针
最后一个字符的地址(’ \0 ’ 的地址)- 首元素地址 = 字符串长度
unsigned int my_strlen(char* str) { assert(str); char* start = str; while (*str != '\0')//或者直接写成while (*str) { str++; } return str - start; }
💶strcpy - 字符串拷贝
char* my_strcpy(char* arr1, const char* arr2) { char* sta = arr1; assert(arr1 && arr2); while (*arr1++ = *arr2++) { ; } return sta; }
PS: 其中while循环部分相当于:
while (*arr) { *arr1 = *arr2; arr1++; arr2++; }
💶strcat - 字符串拼接
char* my_strcat(char* dest, const char* source) { assert(dest && source); char* str = dest; while (*dest)//不可以*dest++,否则最后会多加一次 { dest++; } while (*dest++ = *source++) { ; } return str; }
💶strcmp - 比较两个字符串
int my_strcmp(const char* arr1, const char* arr2) { assert(arr1 && arr2); while (*arr1 == *arr2) { if (*arr1 == '\0') return 0; arr1++; arr2++; } return *arr1 - *arr2; }
ps,在VS上,如果*arr1 > *arr2,返回1 ; = 返回0;< 返回-1
因此可以这样:
if (*arr1 > *arr2) return 1; else return -1;
💶strstr - 字符串查找
函数接口:char *strstr( const char *string, const char *strCharSet );
在string中找strCharSet,如果找到了,返回strCharSet在string中第一次出现的位置;找不到,则返回空指针 NULL
char* my_strstr(const char* str1, const char* str2) { assert(str1 && str2); if (*str2 == '\0') return str1; const char* s1 = str1; const char* s2 = str2; const char* yd = str1; while (*yd) { s1 = yd; s2 = str2; while (*s1 == *s2) { s1++; s2++; } if (*s2 == '\0') return yd; yd++; } return NULL; }
📗mem
💵memcpy - 内存拷贝
void* my_memcpy(void* dest, const void* src, size_t num) { void* ret = dest; assert(dest && src); while (num--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } return ret; }
💵memmove - (重叠)内存拷贝
相当于memcpy的升级版
void* my_memmove(void* dest, const void* src, size_t num) { void* ret = dest; assert(dest && src); if (dest < src) { while (num--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } } else { while (num--) { *((char*)dest + num) = *((char*)src + num); } } return ret; }
💵memcmp - 比较
int my_memcmp(const void* arr1, const void* arr2,size_t num) { assert(arr1 && arr2); while (num--) { if (*(char*)arr1 == '\0') return 0; arr1 = (char*)arr1 + 1; arr2 = (char*)arr2 + 1; } return (char*)arr1 - (char*)arr2; }