为了更好地理解string的各个库函数,现将几个常用的库函数用自己的方式实现如下:

#include<iostream>
using namespace std;
#include<cassert> //求字符串的长度 (注:'\0'的长度不计算在内)
int my_strlen(char* str)
{
if (str == NULL)
{
return 0;
}
int len = 0;
while (*str++ != '\0')// '\0'不计算在内
{
len++;
}
return len;
} //string比较函数
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 != NULL && str2 != NULL); if (*str1 == '\0' && *str2 == '\0')
return 0; int result = 0;//记录比较结果:相等记录0;str1大于str2,记录1;str1小于str2,记录-1; while (*str1 != '\0')
{
if ((result = *str1 - *str2) != 0) // *str1!=*str2
{
break;
}
str1++;
str2++;
}
if (result > 0)
result = 1;
else if (result < 0)
result = -1;
return result;
} //查找str2是否为str1的字串,并返回str2在str1中第一次出现的位置
const char* my_strstr(const char* str1, const char* str2)
{
assert(str1 != NULL);
assert(str2 != NULL);
const char* ps1 = str1;
const char* ps2 = str2;
while (*ps1 != '\0')
{
const char* ret = NULL;
if (*ps1 == *ps2)
{
ret = ps1;
while (*ps1++ == *ps2++)
{
if (*ps2 == '\0')
{
return ret;
}
}
}
else
ps1++;
}
return NULL;
} //字符串拷贝函数
char* my_strcpy(char* dst, const char* src)
{
assert(dst != NULL);
assert(src != NULL);
char* pDst = dst; //保护参数
const char* pSrc = src; //保护参数
while (*pDst != '\0')
{
*pDst++ = *pSrc++;
}
return dst;
} //string 连接函数
char* my_strcat(char* dst, const char* src)
{
assert(src != NULL && dst != NULL); char* pDst = dst;
const char* pSrc = src;
while (*pDst != '\0')
{
pDst++;
}
while (*pSrc != '\0')
{
*pDst++ = *pSrc++;
}
*pDst = '\0'; return dst;
} int main()
{
char c1[10] = "abcd";
char c2[10] = "98712345";
char c3[5] = "1234"; char c4[5] = "abcd";
char c5[5] = "abbb";
char c6[5] = "abcd"; cout << "my_strlen(src):" << my_strlen(c1) << endl; cout << "my_strcmp(c4, c5):" << my_strcmp(c4, c5) << endl;
cout << "my_strcmp(c4, c6):" << my_strcmp(c4, c6) << endl;
cout << "my_strcmp(c5, c6):" << my_strcmp(c5, c6) << endl; const char* ret = my_strstr(c2, c3);
cout << "my_strstr(c2, c3)=> ret:" << ret << endl; my_strcpy(c2, c3);
cout << "my_strcpy(c2, c3)=> c3:" << c3 << endl;
cout << "my_strcpy(c2, c3)=> c2:" << c2 << endl; my_strcat(c1, c3);
cout << "my_strcat(c1, c3)=> c1:" << c1 << endl;
}

自己实现的string的库函数的更多相关文章

  1. Arduino String.h库函数详解

    此库中包含 1 charAT() 2 compareTo() 3 concat() 4 endsWith() 5 equals() 6 equalslgnoreCase() 7 getBytes() ...

  2. 4.std::string中库函数的使用。

    为了美观,我们把输入和输出设计成如下: #include <iostream> #include <string> int main() { std::string name; ...

  3. 关于符号匹配题的一些思考过程--含cin.getline()函数的一些基本原理

    刚刚拿到题目的时候,还没啥感觉,就是觉得要用到if--else就可以了,但是一联想到现在是在学栈,那么是不是要用到栈呢? 一.那么先看看题目吧 给定一串字符,不超过100个字符,可能包括括号.数字.字 ...

  4. Spring-1-A Post Robot(HDU 5007)解题报告及测试数据

    Post Robot Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K Problem Description ...

  5. Redis 数据结构之简单动态字符串SDS

    几个概念1:key对象 数据库存储键值对的键,总是一个字符串对象.2:value对象 数据库存储键值对的值,可以是字符串对象,list对象,hash对象,set对象,sorted set对象.    ...

  6. C++基础--sizeof和strlen的区别

    首先,来运行一段程序: #include "stdafx.h" #include <stdio.h> #include <string.h> int mai ...

  7. arduino 字符解析

    Arduino String.h库函数详解   此库中包含1 charAT()2 compareTo()3 concat()4 endsWith()5 equals()6 equalslgnoreCa ...

  8. string.h中的库函数

    虽然面试的时候,都会叫你不使用c库函数,自己完成某某函数的编写,但是库函数毕竟更让人信赖,我们没有任何理由怀疑库函数而使用自己的版本.不过当做练习,自己还是可以实现一下的.这里记录一下5th c pr ...

  9. Lua的string库函数、lua中string的模式匹配

    --****************Lua的string库函数****************** --1.string.byte --string.byte (s [, i [, j]]) --取出 ...

随机推荐

  1. Jenkins+Git 持续集成

    持续集成是必要的! 希望达到的效果是:开发同事签入代码后,对应的站点可以自动实现更新.目前还只在在内部服务器上实现开发环境中的站点更新,不涉及到线上的发布. 目前使用Jenkins实现这样的持续集成. ...

  2. 向上管理(manage up)的的五条原则

    绝大多数的工程师很可能很少关注代码之外的能力,摸爬滚打了将近10年后,我才领悟到除了技术之外还有一项最重要的修炼,那就是"领导与被领导"学(其中包含了换位思考,但不局限于换位思考) ...

  3. 为什么每个浏览器User-Agent都是Mozilla?真相原来是这样!

    转载自简明现代魔法http://www.nowamagic.net/librarys/veda/detail/2576 故事还得从头说起,最初的主角叫NCSA Mosaic,简称Mosaic(马赛克) ...

  4. mybatis基础,mybatis配置文件核心组件typeHandler元素

    无论是从预处理语句中设置一个值,还是从结果集里取出一个值,都会用类型处理器将获取的值以合适的方式转换成 Java 类型 可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型 实现 o ...

  5. 腾讯QQ会员技术团队:人人都可以做深度学习应用:入门篇(下)

    四.经典入门demo:识别手写数字(MNIST) 常规的编程入门有"Hello world"程序,而深度学习的入门程序则是MNIST,一个识别28*28像素的图片中的手写数字的程序 ...

  6. 对VC++6.0爱得深沉(二)个性工具的定制

    初始界面看起来很简洁,但是经过一番改造后,你会拥有私人定制的壮丽界面O(∩_∩)O~,让我们开始吧. 1)原有工具的显示隐藏.位置调整: 比如你觉得这个插入图标没什么用,想把这个隐藏,那么你可以打开[ ...

  7. Cesium原理篇:3D Tiles(3)个人总结

    个人结论:目前,在演示层面,3D Tiles问题不大,但项目应用上就不够成熟了,所以问问自己,你是想吃瓜呢还是想吃螃蟹? 好的方面 数据规范 我非常喜欢glTF的整体设计,概括有四点:第一,数据块(B ...

  8. Spring的IoC容器

    Spring是一个轻量级的Java开发框架,其提供的两大基础功能为IoC和AOP,其中IoC为依赖反转(Inversion of Control).IOC容器的基本理念就是"为别人服务&qu ...

  9. Unity无缝循环世界实现

    一年前曾经碰到过已无限世界为题材的游戏开发比赛,虽然对比赛没有兴趣,但是对这个题材倒是有点想法.如何通过unity3d实现无缝的循环世界呢. 有一种想法是动态生成,一块场景一块场景进行动态加载.(做过 ...

  10. unity3D插件开发——前篇

    Unity3D(以下简称Unity)是今年来非常流行的游戏开发引擎.他不仅有足够和unreal(虚幻)引擎媲美的渲染效果,足够多的平台输出,更为突出的就是Unity本身的编辑器.unity本身除了使用 ...