C语⾔-常⽤字符函数详解+模拟实现
今天是2021年9⽉21⽇,⾸先祝⼤家中秋节快乐啦!但愿⼈长久,千⾥共婵娟。⼜是⼀年⽉圆,祝⼤家在中秋节都能和你爱的⼈和爱你的⼈团圆~
接下来进⼊整体啦~
⽬录
下列函数都是包含在#include<string.h>的库函数,若要使⽤,要现在最开始包含这个库
strlen()
1.作⽤:求字符串长度
字符串以\0为结束标志,strlen()函数返回的是在字符串中‘\0’前⾯出现的字符个数(不包含\0)
参数指向的字符串必须要以\0结尾
函数的返回类型为size_t,是⽆符号数
2.模拟实现:
⽅法1:计数器
size_t my_strlen(const char* str)
{
size_t count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
int main()
{
char* str = "Mango";
size_t count = my_strlen(str);
printf("%u\n", count);
return 0;
}
⽅法2: 指针-指针
指针-指针->得到的是⼆者相差的元素的个数 所以⼀个尾指针指向\0,⼀个指向起始位置,⼆者相减得到的就是字符串长度
size_t my_strlen(const char* str)
{
const char* start = str;
const char* end = str;
while (*end)
{
end++;
}
return end - start;
}
int main()
{
char* str = "Mango";
size_t count = my_strlen(str);
printf("%u\n", count);
return 0;
}
⽅法3:递归
size_t my_strlen(const char* str)
{
//如果指向的不是\0,就+1(本⾝指向的字符),然后递归下⼀个字符
if (*str)
{
return 1 + my_strlen(str + 1);
}
//str指向的是\0就返回0
else
{
return 0;
}
}
int main()
{
char* str = "Mango";
size_t count = my_strlen(str);
printf("%u\n", count);
return 0;
}
strcpy()
1.作⽤:字符串拷贝,strcpy:拷贝的是源字符串开始向后直到\0前的内容注意点:
源字符串必须以\0结束
会将源字符串的\0拷贝到⽬标空间
⽬标空间必须⾜够⼤,以确保能存放源字符串
⽬标空间必须可变
2.模拟实现
注意点:源字符串不修改,所以⽤const修饰,返回类型为char*,返回的是⽬标空间的起始地址,所以定义⼀个指针保存起始地址,然后将src指向的内容拷贝到dest中
char* my_strcpy(char* dest,const char* src)
{
assert(dest&&src);
char* ret = dest; //保存起始地址
while(*src)
{
*dest = *src;
dest++;
src++;
}
//上述只是完成了将src中\0之前的内容拷贝
//还要拷贝\0
*dest = *src;
return ret;
}
int main()
{
char arr1[] = "xxxxxxx";
char arr2[] = "Mango";
char* ret = my_strcpy(arr1,arr2);
printf("%s\n",arr1);
printf("%s\n",ret);
return 0;
}
简易写法:
char* my_strcpy(char* dest,const char* src)
{
assert(dest&&src);
char* ret = dest; //保存起始地址
while(*dest++ = *src++)
{
;
}
return ret;
}
最后⼀次,src指向\0,把\0也拷贝过去之后,while判断表达式为假,跳出循环。
strcat()
1.作⽤:字符串追加函数,从⽬标空间的\0位置开始向后追加源字符串
注意事项:
源字符串必须以\0结尾
⽬标空间也必须⾜够⼤,能容纳下源字符串的内容
⽬标空间必须可修改
不可以给⾃⼰追加!
2.模拟实现
思路:由于是在⽬标空间的\0位置开始向后追加,所以要先到⽬标空间的\0位置,追加类似于strcpy过程,⼀个字符⼀个字符的追加,直到遇到源字符串的\0
注意:返回的是⽬标空间的起始地址,所以⽤指针变量保存它的地址。源字符串不修改,所以⽤const修饰
char* my_strcat(char* dest,const char* src)
{
assert(dest && src);
char* ret = dest;
//1.到⽬标空间的\0位置
while (*dest)
{
dest++;
}
//跳出循环时,dest指向的就是⽬标空间的\0位置,从该位置向后追加,相当于strcpy
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "Mango";
char arr2[] = "Hello";
my_strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
strncpy()
strcmp()
1.作⽤:字符串⽐较函数,strcmp 是⽐较字符串的库函数,⽐较的是字符串的内容,不是长度。⽐较的是两个字符串中,⼆者对应的第⼀个不相等字符的ascii码值⼤⼩, ⽐较的是\0之前的字符
2.模拟实现
思路:遍历两个字符串,对应位置的字符⽐较是否相等,到第⼀个⼆者对应不相等的字符,解引⽤,⽐较其对应的ascii码值
注意:当⼆者指向的字符相同时,判断其中⼀个指向的是不是\0,如果是,说明这两个字符串是⼀样的,
两个字符串只需要⽐较,不需要修改,所以⽤const修
int my_strcmp(const char* s1,const char* s2)
{
assert(s1 && s2);
//当⼆者指向的字符相同时,继续,直到到不相等的,或者其中⼀个为\0了,那就跳出循环
while(*s1 == *s2)
{
//先判断其中⼀个是不是\0,如果是,说明两个字符串是⼀样的,⼆者都指向了\0
if(*s1 == '\0')
{
return 0;
}
s1++;
s2++;
}
//到指向不想等的字符了(或者⼀个为\0了),解引⽤⽐较对应的值
return *s1 - *s2;
}
int main()
{
char arr1[] = "abcd";
char arr2[] = "";
int ret = my_strcmp(arr1, arr2);
if (ret > 0)
{
printf("arr1 > arr2\n");
}
else if (ret < 0 )
{
printf("arr1 < arr2\n");
}
else
{
printf("arr1 = arr2\n");字符串比较函数实现
}
return 0;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论