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; }