模拟实现:”strlen strcpy strcat
strlen




strcat:

- #define _CRT_SECURE_NO_WARNINGS
- #include
- #include
- strlen
- 1.通过指针移动模拟
- //int my_strlen(char* str) {
- // size_t count = 0;
- // assert(str != NULL);
- // while (*str != '\0') {
- // count++;
- // str++;
- // }
- // return count;
- //}
- 2.通过指针减指针模拟
- //int my_strlen(char* str) {
- // char* start = str;
- // while (*str != '\0') {
- // str++;
- // }
- // return str - start;
- //}
- //通过递归模拟
- //int my_strlen(char* str) {
- // if (*str != '\0')
- // return 1 + my_strlen(str + 1);
- // else
- // return 0;
- //}
- //int main() {
- // char arr[] = "abcd";
- // size_t len=my_strlen(arr);
- // printf("%zd\n", len);
- // return 0;
- //}
- //模拟实现strcpy
- //strcpy的功能是将原字符串拷贝到目标空间
- //所以返回目标空间的起始地址,方便观察目标空间的数据
- //#include
- //#include
- //版本1
- //void my_strcpy(char* dest, char* str) {
- // while (*str != '\0') {
- // *dest = *str;
- // str++;
- // dest++;
- // }
- // *dest = *str;
- //}
- //版本2
- //dest指向的空间是需要改变的,而src指向的空间是不需要被改变的
- //void my_strcpy(char* dest, const char* str) {//加上const可以提高代码的健壮性
- // assert(dest && str);//解引用时指针不能为空
- // while (*dest++ = *str++) {//()内为赋值表达式且'\0'的ASCII为0
- // ;
- // }
- //}
- //版本3
- //char* my_strcpy(char* dest,const char* str) {
- // char* start = dest;//dest为1级指针然后赋给start
- // //判断是否为空指针
- // assert(dest);
- // assert(str);
- // while (*dest++=*str++)
- // {
- // ;
- // }
- // return start;//返回目标空间的起始地址
- //}
- //int main() {
- // char arr1[] = "abcd";
- // char arr2[20] = {0};
- // my_strcpy(arr2, arr1);
- // printf("%s\n", arr2);
- // 版本3:链式访问
- // ///*printf("%s\n", my_strcpy(arr2, arr1));*/
- // return 0;
- //}
- 模拟strcat---字符串的追加
- my_strcat无法实现自身追加自身------因为目标空间的'\0'会被覆盖
- -------------------但strcat可实现-------------------
- 注:1.目标空间的有'\0'(从哪里开始追加),源头空间也得有'\0'(追加到什么时候结束)
- 2.目标空间足够大且目标空间可修改
- 测试
- #include
- #include
- int main() {
- char arr1[20] = "hello \0xxxxxxxxxx";
- char* p = "world";
- strcat(arr1, p);
- printf("%s\n", arr1);
- return 0;
- }
- 模拟实现strcat
- strcat返回目标空间的起始地址
- //#include
- //#include
- //char* my_strcat(char* dest, const char* src) {
- // char* start = dest;
- // assert(dest);
- // assert(src);
- // //1.找到目标空间中的'\0'
- // while (*dest!='\0')
- // {
- // dest++;
- // }
- // //2.完成拷贝
- // while (*dest++=*src++)
- // {
- // ;
- // }
- // return start;
- //}
- //int main() {
- // char arr1[20] = "hello";
- // char* p = "world";
- // my_strcat(arr1, p);
- // printf("%s\n", arr1);
- // return 0;
- //}
- //strncat可实现自身追加自身