我们知道包含string.h头文件后,就可以使用strlen和strcpy这两个库函数,strlen是用来求字符串的长度,strcpy是将一个要复制的字符串复制到另一个目标里,接下来我们将模拟实现他们。
目录
# strlen的模拟实现
# strcpy的模拟实现
# strlen的模拟实现
#include <stdio.h> size_t my_strlen(const char* p) //const 是为了不使字符串被修改 { //size_t 是无符号整数unsigned int // 因为没有负数的字符串,所以 // 用他作为返回值 int count = 0; while (*p++ != '\0') { count++; } return count; } int main() { char str[] = "Today is a good day"; int ret = my_strlen(str); printf("%d", ret); return 0; }
这只是其中一种方法,接下来还有两种方法 ,分别为指针减指针,递归
1.指针减指针
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> size_t p_p_strlen(char* arr); int main() { char arr[] = "nishishabima?"; printf("%d", p_p_strlen(arr)); return 0; } size_t p_p_strlen(char* arr) { char* p1 = arr; char* p2 = arr; while (*p2++ != '\0') { ; } return p2 - p1 -1; //最后p2还要++,所以要减1 }
2.递归
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> size_t destrlen(char* arr); int main() { char arr[] = "nishishabima?"; printf("%d\n", destrlen(arr)); return 0; } size_t destrlen(char* arr) { if (*arr == '\0') return 0; else { return 1 + destrlen(arr + 1); } }
# strcpy的模拟实现
#include <stdio.h> char* my_strcpy(char* aim, const char* str) //const同理 { assert(aim && str); //断言判断一手,防止为空(NULL) char* cur = aim; while (*aim++ = *str++) { ; } *aim = '\0'; //不加'\0'的话,打印时越界打印,直到遇见\0 return cur; } int main() { char str[] = "Today is a good day"; char aim[30]; my_strcpy(aim, str); printf("%s", aim); return 0; }
这个代码还可以改造一下,变得简洁一点并做优化
#include <stdio.h> #include <assert.h> char* my_strcpy(char *aim, const char *str) //const同理 { assert(aim && str); //断言判断一手,防止为空(NULL) while (*aim++ = *str++) { ; } *aim = '\0'; //不加'\0'的话,打印时越界打印,直到遇见\0 return aim; } int main() { char str[] = "Today is a good day"; char aim[20]; my_strcpy(aim, str); printf("%s", aim); return 0; }