strlen介绍及实现
strlen的作用是求字符串长度。因为字符串的结束标志是'\0',所以strlen统计的是'\0'之前出现的字符的个数。另外我们还需要注意的是strlen函数的返回类型是size_t类型,即无符号整形,那我们看一下下面这一段代码:
#include<stdio.h> #include<string.h> int main() { if(strlen("abc") - strlen("abcdef") > 0) printf(">\n"); else printf("<=\n"); return 0; }
看到这一段代码有人肯定会说3 - 6 < 0屏幕上会打印<=,事实上打印的是>。因为strlen返回的是无符号数,而两个无符号数相减的结果类型也应该是一个size_t类无符号数。所以两数相减的结果-3会被当成一个无符号数,则就大于0了。
综上所述,我们在模拟实现strlen函数时,必须注意以下几点:
- 要正确获取到字符串长度的话,那么字符串中必须有
'\0' - 要注意
strlen的返回类型为size_t
方法一:
#include<stdio.h> size_t my_strlen(const char* str) { size_t count=0; //计数器,统计字符串长度 assert(str != NULL); while(*str != '\0') { count++; str++; } return count; } int main() { char arr1[]="abcdef"; size_t len=my_strlen(arr1); return 0; }
方法二:
指针 - 指针----->地址 - 地址 :得到的的是指针和指针之间的元素的个数:
#include<stdio.h> size_t my_strlen(const char* str) { assert(p != NULL); char* cur=str; while(*cur != '\0') { cur++; } return cur - str; } int main() { char arr1[]="abcdef"; size_t len=my_strlen(arr1); return 0; }
方法三:
递归方式(不创建临时变量)
#include<stdio.h> size_t my_strlen(const char* str) { if(*str != '\0') return 1+my_strlen(str+1); else return 0; } int main() { char arr1[]="abcdef"; size_t len=my_strlen(arr1); return 0; }
strcpy介绍及实现
strcpy函数就是将一个字符串拷贝到另一个字符串中的函数,在拷贝字符串时也会将字符串的结束标志'\0'也拷贝进去。这里的destination指的是目标字符串,即我们要拷贝字符串进去的字符串。
source指的是源字符串,即需要拷贝的字符串,因为这个源字符是不需要修改的,所以为了避免错误我们就用const修饰。
此函数的返回值是一个char*指针,指向了拷贝后的字符串。
通过上面的介绍我们在模拟实现strcpy函数时需要注意以下几点:
- 源字符串必须包含
'\0',同时'\0'也会被拷贝到目标空间。 - 要保证目标空间足够大,能放下拷贝来的数据
- 保证目标空间可以修改
#include<stdio.h> #include<assert.h> void my_strcpy(char* dest,const char* src) { assert(dest && src); while(*dest++ = *src++) { ; } } int main() { char arr1[]="abcdef"; char arr2[20]={0}; my_strcpy(arr1,arr2); return 0; }