模拟实现的字符串函数
该文章将简易模拟实现strlen、strcpy、strcat、strcmp、strstr。那么让我们废话少说,直接开始吧。
一、strlen
strlen-Get string length.即获取字符串长度。函数参数为 const char* str,函数返回类型为 size_t。如下图所示: strlen函数的读取结束标志为’\0’,因此,若字符串中没有’\0’,字符串长度则为随机值。
下面将以三种方式模拟实现strlen函数,函数将命名为 my_strlen。
1.使用计数器
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* str)
{
assert(str);
size_t count = 0;
while (*str++)
{
count++;
}
return count;
}
int main()
{
char arr[] = "hello world!";
int ret = my_strlen(arr);
printf("%d\n", ret);
return 0;
}
显示结果:
该方法为设置一个计数器变量 count,让计数器在指针每增加一个字节时自增一,当 *str 为’\0’时,循环结束,返回的count就是字符串长度。
2.使用函数递归
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* str)
{
assert(str);
if (*str != '\0')
return 1 + my_strlen(str + 1);
else
return 0;
}
int main()
{
char arr[] = "hello world!";
int ret = my_strlen(arr);
printf("%d\n", ret);
return 0;
}
显示结果:
3.使用指针-指针
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* str)
{
assert(str);
const char* start = str;
const char* end = str;
while (*end != '\0')
{
end++;
}
return end - start;
}
int main()
{
char arr[] = "hello world!";
int ret = my_strlen(arr);
printf("%d\n", ret);
return 0;
}
显示结果:
二、strcpy
strcpy-Copy string.即拷贝字符串。函数参数为 char* dest 和 const char* scr,函数返回类型为 char*。如下图所示: 源字符串必须以’\0’结束,目标字符串会将’\0’一同拷贝 下面将模拟实现strcpy,函数命名为my_strcpy
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* scr)
{
assert(dest);
assert(scr);
char* start = dest;
while (*dest++ = *scr++)
{
;
}
return start;
}
int main()
{
char arr1[20] = "xxxxxxxxxxxxxxxxxxx";
char arr2[] = "hello world!";
printf("%s\n", my_strcpy(arr1, arr2));
return 0;
}
显示结果:
三、strcat
strcat-Concatenate strings.即连接字符串。函数参数为 char* dest 和 const char* scr,函数返回类型为 char*。如下图所示: 源字符串必须以’\0’结束,否则程序将崩溃。 下面将模拟实现strcat,函数命名为my_strcat
#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, const char* scr)
{
assert(dest);
assert(scr);
char* start = dest;
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *scr++)
{
;
}
return start;
}
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world!";
printf("%s\n", my_strcat(arr1, arr2));
return 0;
}
显示结果:
四、strcmp
strcmp-Concatenate strings.即比较两个字符串。函数参数为 const char* str1 和 const char* str2,函数返回类型为 int。如下图所示: 标准规定: 1. str1>str2,返回值>0 2. str1==str2,返回值=0 3. str1<str2,返回值<0
下面将模拟实现strcmp,函数命名为my_strcmp
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* str1, const char* str2)
{
assert(str1);
assert(str2);
while (*str1 == *str2)
{
if (*str1 != '\0')
{
str1++;
str2++;
}
else
return 0;
}
return *str1 - *str2;
}
int main()
{
char arr1[] = "abc";
char arr2[] = "abcd";
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;
}
显示结果:
|