字符串函数的模拟实现(strlen、strcpy、strcat、strcmp)
文章目录
- 一、strlen
- 1.库函数中的strlen
- 2.模拟实现strlen
- (1)计数器实现
- (2)递归实现
- 二、strcpy
- 1.库函数中的strcpy
- 2.模拟实现strcpy
- 三、strcat
- 1.库函数中的strcat
- 2.模拟实现strcat
- 四、strcmp
- 1.库函数中的strcmp
- 2.模拟实现strcmp
- 感谢阅读,如有错误请批评指正
一、strlen
1.库函数中的strlen
库函数中的strlen是用来求字符串长度的(不包含’\0’)
用法如下:
int main()
{
char arr[] = "abcdef";
int sum = strlen(arr);
printf("%d\n", sum);
return 0;
}
2.模拟实现strlen
(1)计数器实现
思路:定义一个计数器count,从0开始,当字符串元素不为’\0’时,count++,为’\0’时停止
代码如下(示例):
int my_strlen1(char* p)
{
int count = 0;
while (*p != '\0')
{
count++;
p++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
int sum = my_strlen1(arr);
printf("%d\n", sum);//sum = 6
return 0;
}
(2)递归实现
思路:以字符串”abcdef”为例
strlen(“abcdef”)
=1 + strlen(“bcdef”)
=1 + 1 + strlen(“cdef”)
=1 + 1 + 1 + strlen(“def”)
=1 + 1 + 1 + 1 + strlen(“ef”)
=1 + 1 + 1 + 1 + 1 + strlen(“f”)
=1 + 1 + 1 + 1 + 1 + 1 = 6
代码如下(示例):
int my_strlen2(char* p)//p指向字符串的首元素
{
if (*p != '\0')
//直到找到'\0'为止
return 1 + my_strlen2(p + 1);
//p+1指向字符串的下一个元素
else
return 0;
}
int main()
{
char arr[] = "abcdef";
sum = my_strlen2(arr);
printf("%d\n", sum);//sum = 6
return 0;
}
二、strcpy
1.库函数中的strcpy
库函数中的strcpy可拷贝字符串。
char* strcpy(char* dest, const char* src);
表示将字符串src中的内容拷贝到字符串dest中(包含’\0’)并返回dest的地址。
用法如下:
int main()
{
char arr1[50] = "******************";
char arr2[] = "hello world!";
char* parr1 = strcpy(arr1, arr2);
//将arr2中的内容拷贝到arr1中,并返回arr1的地址
printf("%s\n", arr1);
printf("%s\n", parr1);
return 0;
}
2.模拟实现strcpy
思路:遍历数组src中的每一个元素,并将每一个元素放入dest中。
代码如下(示例):
void my_strcpy(char* dest, char* src)
{
while (*src != '\0')
{
*dest = *src;
dest++;
src++;
}
*dest = *src;
//将'\0'拷贝到dest中
}
以上代码是strcpy的基本功能。
针对以上代码可以进行进一步优化。
代码如下(示例):
//库函数中strcpy的返回值是dest的地址
char* my_strcpy(char* dest, const char* src)
//src中的内容不应被改变,加上const来保护
{
//assert防止出现指向NULL的指针
assert(dest != NULL);
assert(src != NULL);
//assert(dest && src);这种写法也可以
char* p = dest;//记录目标数组的地址
while (*dest++ = *src++)
//遍历src的每一个元素并拷贝
//'\0'的ASCII码值为0
//当*src为'\0'时循环条件为假,退出循环
{
;
}
return p;
}
三、strcat
1.库函数中的strcat
库函数中的strcat是字符拼接函数
strcat(arr1, arr2);
表示将arr2中的内容拼接到arr1后面并返回arr1的地址。
用法如下:
int main()
{
char arr1[50] = "hello ";
char arr2[] = "world";
char* ret = strcat(arr1, arr2);
printf("%s\n", ret);
return 0;
}
2.模拟实现strcat
char* my_strcat(char* dest, const char* src);
思路:先找到dest后字符串的’\0’,从该地址开始拷贝src后的字符串
代码如下(示例):
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest)
{
dest++;
}
//此时dest是前一个字符串'\0'的位置
//接下来拷贝src后的内容,与strcpy相同
while (*dest++ = *src++)
{
;
}
return ret;
}
四、strcmp
1.库函数中的strcmp
strcmp(arr1, arr2);
从第一个字符起比较arr1和arr2的每一个字符的ASCII码值(注意不是比较arr1和arr2的长度),若大于返回大于0的值,小于返回小于0的值,等于返回0。
用法如下:
int main()
{
int ret = strcmp("abq", "abcd");
printf("%d\n", ret);
return 0;
}
注:当两个字符串不相同时,库中要求返回大于0、小于0的值,有些编译器将其固定为1和-1。
2.模拟实现strcmp
思路:遍历两个字符串的每一个元素,直到有不同的字符时停止
int my_strcmp(const char* str1, const char* str2)
//两个字符串都不应被修改,加const保护
{
assert(str1 && str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1 - *str2;
//str1 > str2返回大于0的值
//str1 < str2返回大于0的值
}
还没有评论,来说两句吧...