1.模拟实现strlen
模拟实现strlen函数有三种基本方式:
方式1:计数器方式
#include<stdio.h> int my_strlen(const char* str) { int count = 0; while (*str) { count++; str++; } return count; }
方式2:不能创建临时变量计数器
1. #include<stdio.h> 2. int my_strlen(const char* str) 3. { 4. if (*str == '\0') 5. return 0; 6. else 7. return 1 + my_strlen(str + 1); 8. }
方式3:指针-指针的方式
1. #include<stdio.h> 2. int my_strlen(char* s) 3. { 4. char* p = s; 5. while (*p != ‘\0’) 6. p++; 7. return p - s; 8. }
2.模拟实现strcpy
#include<stdio.h> #include<assert.h> char* my_strcpy(char* dest,const char* src) { char* ret = dest; assert(dest && src); while (*dest++ = *src++) { ; } return ret; } int main() { char arr1[20] = { 0 }; char arr2[] = "abc"; my_strcpy(arr1, arr2); printf("%s\n", arr1); return 0; }
my_strcpy这个函数的返回值是char*,参数是两个char*的指针,但是第二个参数也就是源字符串是不需要改动的,所以加上const限制一下。
首先我们用while循环,将*src找到的字符存放到*dest里面去,只要这个字符不是\0,这个循环就还是会执行,然后使用后置++,跳过一个字符。我们在进入while循环之前使用assert进行断言一下,保证dest和src不为NULL。
strcpy在库函数里面的规定的返回值是目标空间的起始地址,所以先用char*的指针保存一下dest的起始地址,最后返回ret。
3 模拟实现strcat
#include<stdio.h> #include<assert.h> char* my_strcat(char* dest,const char* src) { char* ret = dest; assert(dest && src); while(*dest != '\0') { *dest++; } while (*dest++ = *src++) { ; } return ret; } int main() { char arr1[20] = "abc"; char arr2[] = "def"; my_strcat(arr1, arr2); printf("%s\n", arr1); return 0; }
第一步我们先找到目标空间的末尾,也就是找到\0,第二步进行数据追加。
用第一个while循环找到目标空间的末尾,再用第二个while循环进行数据追加,追加的过程和strcpy是一样的。
4 模拟实现strcmp
#include<stdio.h> #include<assert.h> int my_strcmp(const char* str1, const char* str2) { assert(str1 && str2); while (*str1 == *str2) { str1++; str2++; } if (*str1 > *str2) return 1; else return -1; } int main() { char arr1[] = "abz"; char arr2[] = "abq"; if (my_strcmp(arr1, arr2) > 0) { printf(">\n"); } else { printf("<=\n"); } return 0; }
库函数strcmp的返回值是0,<0,>0,所以返回值为int,因为两个参数都不需要修改,所以使用const限制一下,再用assert断言一下。先写一个while函数判断字符是否相同,相同则++进行下一个字符的比较,如果不相同则进入if,判断是>还是<,>则返回1,否则返回-1。
5.模拟实现strstr
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<assert.h> const char* my_strstr(const char* str1, const char* str2) { const char* cp;//记录开始匹配的位置 const char* s1;//遍历str1指向的字符串 const char* s2;//遍历str2指向的字符串 assert(str1 && str2); if (*str2 == '\0') return str1; cp = str1; while (*cp) { s1 = cp; s2 = str2; while (*s1 && *s2 && *s1 == *s2) { s1++; s2++; } if (*s2 == '\0') return cp; cp++; } return NULL; } int main() { char arr1[] = "abbbcdef"; char arr2[] = "bbc"; const char* ret = my_strstr(arr1, arr2); if (ret == NULL) { printf("找不到\n"); } else { printf("%s\n", ret); } return 0; }
首先我们创建一个指针cp,让cp记录开始匹配的位置。再创建一个指针s1,遍历str1指向的字符串。再创建一个指针s2,遍历str2指向的字符串。所以cp一开始指向的就是str1的起始位置,所以使用while循环,如果str1是NIULL就不用找了,直接返回NULL。如果不是空指针,则进入循环,将cp赋给s1,str2赋给s2。再使用一个while循环,如果*s1和*s2都不为空指针且*s1==*s2的话则进入while循环,然后s1++,s2++,判断下一个字符是否相等,如果出现了不相等的情况,则cp++,从str1的下一个字符开始判断。用if判断如果s2++出现了等于\0的情况,那么就是全部找到了,这个时候就返回cp就行了。当s1为\0的时候也是返回NUL的。