字符串函数模拟实现
- strlen介绍及实现
- strcpy介绍及实现
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;
}
方法三:
递归方式(不创建临时变量)文章来源:https://www.uudwc.com/A/V6DNW/
#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
函数时需要注意以下几点:文章来源地址https://www.uudwc.com/A/V6DNW/
- 源字符串必须包含
'\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;
}