前言:
对常用的几个字符串strlen,strcpy,strcat,strcmp,strstr进行模拟实现
一. strlen函数(求字符串的长度):
#include<stdio.h>
#include<assert.h>
//使用递归方法实现
size_t my_strlen(const char *string)// 自己定义的函数
{
assert(string != NULL); //参数的有效性检查 (断言字符串不能为空)
if (*string == '\0')
return 0;
else
return my_strlen(string + 1) + 1;
}
int main()
{
char str[] = "hafduahfaios";
int len = my_strlen(str);
printf("len = %d\n", len);
return 0;
}
#include<stdio.h>
#include<assert.h>
//使用指针方法实现
size_t my_strlen(const char *string)// 自己定义的函数
{
assert(*string != NULL); //参数的有效性检查 (断言字符串不能为空)
const char *ptmp = string; //指针指向字符串的起始位置
while (*ptmp != '\0')
{
ptmp++;
}
return ptmp - string;
}
int main()
{
char str[] = "hafduahfaios";
int len = my_strlen(str);
printf("len = %d\n", len);
return 0;
}
#include<stdio.h>
#include<assert.h>
//不使用指针
size_t my_strlen(const char *string)// 自己定义的函数
{
assert(*string != NULL); //参数的有效性检查 (断言字符串不能为空)
int count = 0;
while (*string != '\0')
{
count++;
string++;
}
return count;
}
int main()
{
char str[] = "hafduahfaios";
int len = my_strlen(str);
printf("len = %d\n", len);
return 0;
}
二.strcpy函数(字符串拷贝函数):
#include<stdio.h>
#include<assert.h>
char *my_strcpy(char *strDestination, const char *strSource)
{
//①参数的有效性检测
assert(*strDestination != NULL && *strSource != NULL);
//②保护参数,定义临时指针变量保护形参,使指针还指向字符串开头
char *ptmpDest = strDestination;
const char *ptmpSrc = strSource;
while (*ptmpSrc != '\0')
{
*ptmpDest = *ptmpSrc;
*ptmpDest++;
*ptmpSrc++;
}
*ptmpDest = '\0';//③拷贝结束标记
return strDestination;
}
int main()
{
char str1[30] = "Hello abc";
char *str2 = "Linux";
printf("拷贝前str1 = %s\n", str1);
my_strcpy(str1, str2);
printf("拷贝后str1 = %s\n", str1);
return 0;
}
三.strcat函数(字符串链接函数):
#include<stdio.h>
#include<assert.h>
char *my_strcat(char *strDestination, const char *strSource)
{
//①参数的有效性检测
assert(*strDestination != NULL && *strSource != NULL);
//②保护参数,定义临时指针变量保护形参,使指针还指向字符串开头
char *ptmpDest = strDestination;
const char *ptmpSrc = strSource;
//查找strDestination的末尾
while (*ptmpDest != '\0')
{
*ptmpDest++;
}
while (*ptmpSrc != '\0')
{
*ptmpDest++ = *ptmpSrc++;
}
*ptmpDest = '\0';//③链接结束标记
return strDestination;
}
int main()
{
char str1[30] = "Hello abc";
char *str2 = "Linux";
printf("链接前str1 = %s\n", str1);
my_strcat(str1, str2);
printf("链接后str1 = %s\n", str1);
return 0;
}
四.strcmp函数(字符串比较函数):
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char *string1, const char *string2)
{
//参数的有效性检测
assert(*string1 != NULL && *string2 != NULL);
int ret;
while (*string1 != '\0' || *string2 != '\0')
{
ret = *string1 - *string2;
if (ret != 0)
break;
string1++;
string2++;
}
return ret;//返回大于0的数说明str1>str2,返回小于0的数则str1<str2,等于0说明两个字符串相等
}
int main()
{
char *str1 = "Hello";
char *str2 = "Hello";
int ret = my_strcmp(str1, str2);
printf("ret = %d\n", ret);
return 0;
}
五.strstr函数(字符串查找函数(模式匹配)):
#include<stdio.h>
#include<assert.h>
char *my_strstr(const char *string, const char *strCharSet)
{
//参数的有效性检测
assert(string != NULL && strCharSet != NULL);
const char *s = string; //主串
const char *t = strCharSet; //模式串
int i, j;
i = j = 0;
while (s[i] != '\0' && t[j] != '\0')
{
if (s[i] == t[j])
{
i++;
j++;
}
else
{
i = i - j + 1;//关键条件
j = 0;
}
}
if (t[j] == '\0')
{
return s + i - j;
}
return NULL;
}
int main()
{
char *str1 = "This is a string.";
char *str2 = "is";
char *res = my_strstr(str1, str2);
if (res == NULL)
printf("不存在.\n");
else
printf("%s\n", res);
return 0;
}