自定义函数strlen:
在编写这些函数之前,我们来看看库函数里面这些函数是怎么写的:
int my_strlen(char *str) {
int count = 0;
while (*str != '\0') {
count++;
str++;
}
return count;
}
上面的代码就可以用来计算一个字符串的长度了。
但是还有什么改进的地方吗?
不知道你注意到这里的const了没?也许你会觉得奇怪,为什么在库函数的文件里strlen函数要这样写。但它这样写了我们是不是也要照猫画虎来模仿一下这个函数的实现方式呢?(因为人家是库函数嘛!!!)。
改进代码如下:
#include<stdio.h>
int my_strlen(const char* str) {//仅仅加了一个const
int count = 0;
while (*str != '\0') {
count++;
str++;
}
return count;
}
在这里其实我们还可以把代码写的更简短,像这样:
#include<stdio.h>
int my_strlen(const char* str) {
char* start = str;
while (*str) {
str++;
}
return str - start;
}
自定义函数strcpy:
先看看库函数里的strcpy:
从以上信息内可以看到创建这个函数至少需要两个指针。从上面也可以看到两个指针的摆放位置:
现在我们来创建一下这个函数:
#include<stdio.h>
void my_strcpy(char* distination, char* source) {
while (*distination = *source) {//当指针遇到"\0"时判断条件就为假,跳出循环
distination++;
source++;
}
}
为了更完美:
#include<stdio.h>
void my_strcpy(const char* distination, const char* source) {//加上const限定符
while (*distination = *source) {
distination++;
source++;
}
}
再次优化:
void my_strcpy(char* distination, char* source) {
while (*distination++ = *source++) {//指针++:先解引用指针指向的内容,指针的地址再加一。
;
}
}
当然,由于这个函数是由两个指针类型的变量来接收数值的。所以我们需要防止指针接受的是空指针。因此我们在这个函数内部还可以用assert来断言一下:
void my_strcpy(char* distination, char* source) {
assert(distination && source);//只要有一个指针为空,就会报错,并指出错误所在
while (*distination++ = *source++) {
;
}
}
结语:
好了,各位看官,今天的分享就到这里了。如果有错误的话请帮小牛儿指出来哦!!!