在操作字符串的函数大块中,其中有两个函数分别是strcpy和strlen函数,他们都是在#include<string.h>中包含。strcpy函数可以将一个字符数组的内容放到另一个字符数组中,实现字符串拷贝,而strlen函数是求一组字符串的长度的函数。他们都由C库提供,方便程序员使用。
今天我们将近距离还原这两个函数。
strcpy函数
首先我们先来了解一下strcpy函数的架构,他的返回值和参数。
他的返回值类型是一个char*指针,第一个参数是一个将要粘贴的字符数组而第二个参数是被复制的字符数组,我们可以用一个自定义函数将其实现。
#include<stdio.h> void my_strcpy(char* dest, char* scr) { while (*scr != '\0') { *dest = *scr; scr++; dest++; } *dest = *scr; } int main(void) { char arr1[] = "hello world!"; char arr2[20]; my_strcpy(arr2, arr1); printf("%s", arr2); return 0; }
这是我们最先完成的代码,虽然可以将我们的目的达成,也是最简单的方式,但是却没有完全的与原strcpy吻合,返回值并不是char*,所以我们应该在完善一下。
#include<stdio.h> char* my_strcpy(char* dest, char* scr) { char* dp = dest; while (*dest = *scr) { scr++; dest++; } return dp; } int main(void) { char arr1[] = "hello world!"; char arr2[20]; char* p = NULL; printf("%s", my_strcpy(arr2, arr1)); return 0; }
我们现将自定义的函数的返回值改变,并且改变了while循环中的判断条件,使代码更加精炼,并且更像strcpy函数,但这远远不够,当我们传递一个空指针或错误指针时程序也应该做出判断,终止而且应该使用const修饰符在第二个参数中,使其不可被改变,减少bug产出。
我们引出assert函数 (断言函数),就是给出其判断条件,条件成立就继续执行程序,反之失败将终止程序运行,并将错误打印至屏幕。在使用assert函数时要包含#include<assert.h>头文件!!
#include<assert.h> #include<stdio.h> char* my_strcpy(char* dest,const char* scr) { assert(dest != NULL); assert(scr != NULL); char* dp = dest; while (*dest = *scr) { scr++; dest++; } return dp; } int main(void) { char arr1[] = "hello world!"; char arr2[20]; char* p = NULL; printf("%s", my_strcpy(arr2, arr1)); return 0; }
这样一个接近完美的strcpy函数就出来了。
strlen函数
strlen函数是获取字符串长度的,字符串的长度由终止空字符确定,当strlen函数遇到\0将停止。strlen函数返回值是一个size_t(无符号整数),参数为一个字符串的指针,加上const就是为了不改变传过来数组的内容。
#include<assert.h> #include<stdio.h> int my_strlen(const char* str) { assert(str !=NULL) int count = 0; while (*str) { str++; count++; } return count; } int main(void) { char arr[] = "hello world!"; int num = my_strlen(arr); printf("%d\n", num); return 0; }
我们依靠写strcpy的经验,很容易就写出了strlen函数了。