C语言模拟实现字符串处理函数

简介: C语言模拟实现字符串处理函数

需要多一点点勇气,来面对变差的自己


大家好,我是纪宁。


这篇文章为大家带来的是5大字符串处理函数的模拟实现。


文章目录


1.strlen函数的模拟实现


2.strcpy函数的模拟实现


3.strcmp函数的模拟实现


4.strcat函数的模拟实现


5.strstr函数的模拟实现


1.strlen函数的模拟实现

 strlen函数的作用是求字符串的长度


 strlen的函数原型




常规方法


 找 ‘\0’ ,将字符串首地址传递过来,解引用后的值不是‘\0’的话,指针位置就后移,同时计数器count加1,知道指针解引用后的值为‘\0’,循环停止,函数返回计数器count的值


size_t my_strlen(char* str)

{

size_t count = 0;

while (*str != '\0')

{

 count++;

 str++;

}

return count;

}

int main()

{

char str[1000] = "I have a my_strlen hanshu";

size_t len = my_strlen(str);

printf("%zu", len);

return 0;

}


指针减指针


 将字符串首元素地址传过来之后,先用字符指针保存,再将保存的指针移动,找‘\0’,找到‘\0’后,用这个位置的指针减去字符串首元素地址即为字符串长度


 指针减去指针得到的值为两指针之间的元素个数


size_t my_strlen(char* str)

{

char* str2 = str;

while (*str2 != '\0')

 str2++;

return str2 - str;

}

int main()

{

char str[1000] = "I have a my_strlen hanshu";

size_t len = my_strlen(str);

printf("%zu", len);

return 0;

}

递归


 递归方法的核心就是大事化小


 但要注意递归必须有条件,并且每次递归都要越来越接近这个条件


 当传递过来的指针解引用为‘\0’时,说明递归结束,否则就指针后移继续递归


size_t my_strlen(char* str)

{

if (*str == '\0')

 return 0;

else

 return my_strlen(str + 1) + 1;

}

int main()

{

char str[1000] = "I have a my_strlen hanshu";

size_t len = my_strlen(str);

printf("%zu", len);

return 0;

}

2.strcpy函数的模拟实现

 strcpy函数的作用是拷贝字符串


 strcpy的函数原型




注意事项:


 拷贝字符串,必须将 ‘\0’ 也拷贝过去

 目表字符串必须是可变的,不能是常量字符串

 函数要返回目标字符串的首地址,所以要先将首地址存起来

#include<assert.h>

char* my_strcpy(char* str1, const char* str2)

{

assert(str1 && str2);

char* ret = str1;

while (*str2 != '\0')

{

 *str1 = *str2;

 str1++;

 str2++;

}

*str1 = *str2;

return str1;

}

int main()

{

char str1[100] = { "0" };

char str2[100] = "my_strcpy hanshu";

my_strcpy(str1, str2);

return 0;

}


3.strcmp函数的模拟实现

 strcmp函数的作用是字符串比较


 strcmp函数原型


注意事项:


 当str1>str2时返回一个大于0的数,str1<str2时返回一个小于0的数,str1=str2时返回0,所以模拟实现时,当str1!=str2时,可以用 *str1-*str2 来表示返回值


//实现strcmp函数

#incldue<stdio.h>

#include<assert.h>

int my_strcmp(const char* str1, const char* str2)

{

assert(str1 && str2);

while (*str1 && *str2)

{

 if (*str2 == *str1)

 {

  str1++;

  str2++;

 }

 else

  return *str1 - *str2;

}

if (*str1 == *str2 && *str1 == '\0')

 return 0;

}

int main()

{

char str1[100] = "abcdefg";

char str2[100] = "abcdefr";

if (my_strcmp(str1, str2) > 0)

 printf("str1>str2\n");

else

 printf("str2>str1\n");

return 0;

}


4.strcat函数的模拟实现

 strcat函数的作用是实现字符串的连接


 strcat函数原型


  实现strcat函数的时候,要先找到‘\0’,然后再模仿字符串拷贝函数的实现将字符串拷贝过去即可,且‘\0’也必须拷贝过去


#include<stdio.h>

#include<assert.h>

char* my_strcat(char* str1, const char* str2)

{

assert(str1&&str2);

char* ret = str1;

//先找str1的  \0

while (*++str1)

  ;

//将str2拷贝过来

while (*str2 != '\0')

{

 *str1 = *str2;

 str1++;

 str2++;

}

*str1 = *str2;

return ret;

}

int main()

{

char arr1[100] = "jining ";

char arr2[100] = "bu shi da yuan zhong";

my_strcat(arr1, arr2);

printf("%s", arr1);

return 0;

}


5.strstr函数的模拟实现

 strstr函数的作用是在字符串中找子字符串


 strstr函数原型




实现strstr函数要设置两重循环,外层循环控制目标字符串的指针位置,判断是否有指针解引用后与子字符串的首字符相同,若相同,再用内层循环判断子字符串是否为目标字符串的一部分


#include<string.h>

char* my_strstr(const char* str1, const char* str2)

{

char* str3 = str1;

int i = 0;

for (i = 0; i < strlen(str1); i++)

{

 int count = 1;

 if (*(str3 + i) == *str2)

 {

  int j = 0;

  for (j = 1; j < strlen(str2); j++)

  {

   if (*(str3 + i + j) == *(str2 + j) && *(str2 + j) != '\0')

    count++;

  }

  if (count == strlen(str2))

   return (str1 + i);

 }

}

return NULL;

}

int main()

{

char str1[100] = "zyb is a big yuanzhong is zyb TT";

char str2[100] = "ong";

char* ret = my_strstr(str1, str2);

printf("%s", ret);

return 0;

}




 博主写了好长时间,如果你能给博主一个免费三连鼓励一下博主的话,那么我觉得你真是 泰     裤    辣 !!!

相关文章
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
34 3
|
6天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
22 6
|
26天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
34 10
|
19天前
|
存储 算法 程序员
C语言:库函数
C语言的库函数是预定义的函数,用于执行常见的编程任务,如输入输出、字符串处理、数学运算等。使用库函数可以简化编程工作,提高开发效率。C标准库提供了丰富的函数,满足各种需求。
|
25天前
|
机器学习/深度学习 C语言
【c语言】一篇文章搞懂函数递归
本文详细介绍了函数递归的概念、思想及其限制条件,并通过求阶乘、打印整数每一位和求斐波那契数等实例,展示了递归的应用。递归的核心在于将大问题分解为小问题,但需注意递归可能导致效率低下和栈溢出的问题。文章最后总结了递归的优缺点,提醒读者在实际编程中合理使用递归。
53 7
|
25天前
|
存储 编译器 程序员
【c语言】函数
本文介绍了C语言中函数的基本概念,包括库函数和自定义函数的定义、使用及示例。库函数如`printf`和`scanf`,通过包含相应的头文件即可使用。自定义函数需指定返回类型、函数名、形式参数等。文中还探讨了函数的调用、形参与实参的区别、return语句的用法、函数嵌套调用、链式访问以及static关键字对变量和函数的影响,强调了static如何改变变量的生命周期和作用域,以及函数的可见性。
29 4
|
30天前
|
存储 编译器 C语言
C语言函数的定义与函数的声明的区别
C语言中,函数的定义包含函数的实现,即具体执行的代码块;而函数的声明仅描述函数的名称、返回类型和参数列表,用于告知编译器函数的存在,但不包含实现细节。声明通常放在头文件中,定义则在源文件中。
|
1月前
|
C语言
c语言回顾-函数递归(上)
c语言回顾-函数递归(上)
31 2
|
1月前
|
Java 编译器 C语言
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
21 3
|
1月前
|
存储 程序员 编译器
C语言——动态内存管理与内存操作函数
C语言——动态内存管理与内存操作函数