本文主要介绍一些常用的字符串库函数的模拟实现,首先,我们来看一下都有哪些函数:
字符串说明 | 字符串类型 |
---|---|
求字符串长度 | strlen |
长度不受限制的字符串函数 | strcpy、strcat、strcmp |
长度受限制的字符串函数 | strncpy、strncat、strncmp |
字符串查找 | strstr、strtok |
错误信息报告 | strerror |
内存操作函数 | memcpy、memmove、memset、memcmp |
接下来,我们就一个一个来进行分析,并模拟实现。
在这里,推荐一个网站cplusplus,在这里面可以查看每个库函数的具体结构和组成框架。
1. strlen函数的模拟实现
函数作用:求解字符串长度。
size_t strlen ( const char * str );
- 字符串的
'\0'
作为结束标志,strlen
函数返回的是在字符串中'\0'
前面出现的字符个数(不包含'\0'
)。 - 参数指向的字符串必须要以
'\0'
结束。 - 注意函数的返回值为
size_t
,是无符号的。
方法一
:计数器方式(也是最常用的一种)
#include <stdio.h>
#include <assert.h>
//模拟实现strlen
int my_strlen(const char* arr)
{
assert(arr);
int count = 0;
while (*arr != '\0')
{
*arr++;
count++;
}
return count;
}
int main()
{
char arr[] = "abc";
int ret = my_strlen(arr);
printf("%d\n", ret);
return 0;
}
【注意】
代码中const
修饰的指针类型表示指针指向的内容不可更改。
assert
语句称为断言,它的本质就是一个宏,宏之中是一个表达式。
“断言”:
如果表达式为真,断言通过,进行之后的逻辑。
如果表达式为假,断言失败,程序主动停止,直接退出。
方法二
递归方式(不创建临时变量)
#include <stdio.h>
#include <assert.h>
int my_strlen(const char * str)
{
if(*str == '\0')
return 0;
else
return 1 + my_strlen(str+1);
}
int main()
{
char arr[] = "abc";
int ret = my_strlen(arr);
printf("%d\n", ret);
return 0;
}
方法三
指针-指针的方式
#include <stdio.h>
#include <assert.h>
int my_strlen( char* arr)
{
char* p = arr;
while (*p != '\0' )
{
p++;
}
return p - arr;
}
int main()
{
char arr[] = "abc";
int ret = my_strlen(arr);
printf("%d\n", ret);
return 0;
}
2. strcpy函数的模拟实现
函数作用:将一个字符串拷贝到另一个字符串中。
char* strcpy(char * destination, const char * source )