strlen
求字符串的长度,在目标空间中逐个阅历,直到遇到'\0'停止,所以这是在模拟实现时的关键,在模拟实现strlen函数时也要注意它的返回值时 size_t指的是unsigned int,当然我们在实现时候可以直接用int 但是在涉及计算会出现问题哦
比如:
点击查看代码,并想一想答案
int main()
{
char arr1[]="abcdef";
char arr2[]="wpf";
if(strlen(arr2)-strlen(arr1)>0)
{
printf("T");
}
else
{
printf("F");
}
return 0;
}
如果你去运行,你会发现结果是 T,这就是返回类型不同的原因
strlen的模拟实现有三种
1 是计数计算法,用变量count来计算长度
点击查看代码
#include<stdio.h>
#include<assert.h>
int my_strlen(char*str)//也可以用 size_t或者unsigned int
{
int count=0;
assert(arr!=NULL);//避免出现空指针,造成代码错误
while(*str!='\0')
{
str++;
count++;
}
}
int main()
{
char arr[]="abcdef";
int ret=my_strlen(arr);
return 0;
}
2,是用递归实现
如果找到字符串‘\0'即返回0,否则的返回1+再次调用该函数并将目标初始指针加一
点击查看代码
#include<stdio.h>
#include<assert.h>
int my_strlen(char*str)
{
assert(str!=NULL);
if(*str='\0')
return 0;
else
return 1+my_strlen(str+1);
}
int main()
{
char arr[]="abcdef";
int ret=my_strlen(arr);
return 0;
}
3,利用指针运算,首先找到目标初指针,在阅历到字符串为‘\0’ 的指针,反回它们的差值
点击查看代码
#include<stdio.h>
#include<assert.h>
int my_strlen(char*str)
{
assert(str);
char*tmp=str;
while(*str!='\0')
{
str++;
}
return str-tmp;
}
int main()
{
char arr[]="abcdef";
int ret=my_strlen(arr);
printf("%d\n",ret);
return 0;
}
strcpy
字符串拷贝,从源字符串拷贝到目标字符串
值得注意的是,在拷贝过程中 源字符串的‘’\0‘也要拷贝进去
也要了解它的返回类型为
char * strcpy ( char * destination, const char * source )
模拟实现
我们知道当数组被函数运用是调用的是数组首个元素的地址,因此将目标字符串首地址解引用等于源字符串,然后同时++;
直到源字符串的‘\0’赋予给目标字符串,循环结束。
点击查看代码
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char*dest,const char*scr)
{
assert(scr);
assert(dest);
char* tmp=dest;
while((*dest++=*scr++))
{
;
}
return tmp;
}
int main()
{
char arr1[]="abcdef";
char arr2[]="wpf";
my_strcpy(arr1,arr2);
printf("%s\n",arr1);
return 0;
}
由此代码也可以发现 目标字符串的空间必须足够容纳源字符串,否则会出现越界访问的问题!!
strcat
称作字符串追加,一般将源字符串追加在目标字符串的后面,需要与strncat作区别
注意:目标字符串必须要有足够的空间让源字符串拷贝进去,包括‘\0’
返回类型为char*,可能你会对它有些奇怪,不过看完代码,你会发现返回类型这样写,挺有意思的!!
代码实现
点击查看代码
#include<stdio.h>
#include<assert.h>
char* my_strcat(char*dest,const char*scr)
{
assert(dest);
assert(scr);
char*tmp=dest;//为了保存目标字符串的首地址,避免后面的运行找不到
while(*dest!=='\0')
{
dest++;
}
while((*dest++=*scr++))
{
;
}
return tmp;//重新返回dest的地址
}
int main()
{
char arr1[30]="hello";//保证目标字符串的空间足够大
char arr2[]="wpf";
my_strcat(arr1,arr2);
printf("%s\n",arr1);
return 0;
}