当前位置: 首页 > news >正文

实现一些常用字符串处理函数

1、字符串copy函数strcpy,实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
#include <assert.h>
char  *mystrcpy( char  *dest, const  char  *sor) //将源字符sor串拷到目的字符串dest
{
     assert (dest);
     assert (sor);
     char  *ret = dest;
     while (*dest++ = *sor++)
     {
         ;
     }
     return  ret;
}

2、判断一个字符串中的子字符串strstr,实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <assert.h>
#include <stdio.h>
char  *mystrstr( char  *str_one, char  *str_two) //判断str_two字符串是不是str_one字符串的子字符                                           //串
{
     char  *pstr_one = NULL;
     char  *pstr_two = NULL;
     while (*str_one)
     {
         pstr_one = str_one;
         pstr_two = str_two;
         while ((*pstr_one)&&(*pstr_one == *pstr_two))
         {
             pstr_one++;
             pstr_two++;
             if (*pstr_two ==  '\0' )
             {
                 return  str_one;
             }  
         }
         str_one++;
     }
     return  NULL;
}

3、三种方法实现求取字符串长度strlen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <assert.h>
//计数器实现strlen
//int mystrlen(const char *dest)
//{
//  assert(dest);
//  int count  = 0;
//  while(*dest)
//  {
//      count++;
//      dest++;
//  }
//  return count;
//}
//指针实现strlen
//int mystrlen(const char *dest)
//{
//  assert(dest);
//  int ret = 0;
//  const char *buff = dest;
//  while(*dest)
//  {
//      dest++;
//  }
//  ret = dest - buff;
//  return ret;
//}
//递归实现strlen
int  mystrlen( const  char  *dest)
{
     assert (dest);
     if (*dest ==  '\0' )
     {
         return  0;
     }
     dest++;
     return  1+mystrlen(dest);
}

4、字符串的比较strcmp,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <assert.h>
int  mystrcmp( const  char  *cmp1, const  char  *cmp2)
{
     assert (cmp1);
     assert (cmp2);
     int  ret = 0;
     while (!(ret = (*(unsigned  char *)cmp1 - *(unsigned  char *)cmp2))&&*cmp2)
     {
         cmp1++;
         cmp2++;
     }
     if (ret>0)
         return  1;
     else  if (ret<0)
         return  -1;
     return  0;
}

5、字符串链接函数strcat,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <assert.h>
char  *mystrcat( char  *dest, const  char  *sor)
{
     assert (dest);
     assert (sor);
     char  *ret = dest;
     while (*dest)
     {
         dest++;
     }
     while (*dest++ =*sor++)
     {
         ;
     }
     return  ret;
}

注意:对于一些特别的符号字符串处理函数就不能很好的解决了,比如要复制或链接两个内容都是'\0',这样就不能很好解决问题。因此就引入了内存的复制和移动函数。

6、拷贝函数,memcpy函数,有三个参数,两个空类型指针(也叫做句柄)(表示可以接受任何类型的指针),一个count字符串大小。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <assert.h>
void  *mymemcpy( void  *dest, const  void  *sor, int  count)
{
     assert (dest);
     assert (sor);
     char  *pdest = ( char  *)dest;
     char  *psor = ( char  *)sor;
     void  *ret = dest;
     while (count--)
     {
         *pdest++ = *psor++;
     }
     return  ret;
}

注意这个函数的的缺点:导致内容被覆盖:

abcdefghij

比如:如果不abcd拷贝到cdef,则会导致cd被ab覆盖,输出的结果为:abababghij而不是:ababcdghij

因此引入,memmove函数。

7、memmove函数,拷贝内存函数,很好的解决的memcpy的不足,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <assert.h>
void  *mymemmove( void  *dest, const  void  *sor, int  count)
{
     assert (dest);
     assert (sor);
     char  *pdest = ( char  *)dest;
     char  *psor = ( char  *)sor;
     void  *ret = dest;
     if (pdest>psor&&pdest<psor+count) //从后向前复制,这样就很好解决了memcpy的覆盖问题
     {
         while (count--)
         {
             *(pdest+count) = *(psor+count);
         }
     }
     else
     {
         while (count--)           
         {
             *pdest++ = *psor++;
         }
     }
     return  ret;
}




本文转自 8yi少女的夢 51CTO博客,原文链接:http://blog.51cto.com/zhaoxiaohu/1719395,如需转载请自行联系原作者

相关文章:

  • [摘录]第11章 造就优势谈判的驱动力
  • java调用斑马GK888t打印机(ZPL指令)
  • 允许chrome 浏览器运行 flash player
  • 注解的使用
  • hadoop各个组件功能
  • 命令行创建虚拟机,无桌面运行virtualbox
  • 一次arp防护配置错误导致的故障
  • 框架替换主页
  • HandlerSocket安装
  • phpstorm10.0安装xdebug插件
  • 网络编程(socket,套接字)
  • selinux
  • Bzoj2756 [SCOI2012]奇怪的游戏
  • 汇新云智慧城市解决方案——以区块链加速智慧城市建设
  • Spring MVC RequestParam
  • 自己简单写的 事件订阅机制
  • $translatePartialLoader加载失败及解决方式
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • ECS应用管理最佳实践
  • gitlab-ci配置详解(一)
  • GitUp, 你不可错过的秀外慧中的git工具
  • Git初体验
  • Javascript基础之Array数组API
  • JavaScript实现分页效果
  • React 快速上手 - 07 前端路由 react-router
  • SOFAMosn配置模型
  • Spring框架之我见(三)——IOC、AOP
  • Terraform入门 - 3. 变更基础设施
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 基于web的全景—— Pannellum小试
  • 力扣(LeetCode)21
  • 温故知新之javascript面向对象
  • 想写好前端,先练好内功
  • 优化 Vue 项目编译文件大小
  • 原生JS动态加载JS、CSS文件及代码脚本
  • Prometheus VS InfluxDB
  • 如何用纯 CSS 创作一个货车 loader
  • ​批处理文件中的errorlevel用法
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • $.ajax()
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (六)c52学习之旅-独立按键
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (转)C#调用WebService 基础
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET 反射 Reflect
  • .pop ----remove 删除
  • [ C++ ] STL---stack与queue
  • [20150629]简单的加密连接.txt
  • [2669]2-2 Time类的定义
  • [ASP.NET 控件实作 Day7] 设定工具箱的控件图标
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)
  • [C#7] 1.Tuples(元组)
  • [C#C++]类CLASS
  • [dfs] 图案计数