为了更好地理解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. vSphere在RedHat6.0上搭建Oracle 11g R2 RAC环境

    一.前期准备工作 1.1 为方便操作,装完系统后我们先安装Vmware Tools: 1.1.1.安装工具 在VMware的菜单栏上选择"虚拟机/安装虚拟机工具(VM/Install VMw ...

  2. 1641: [Usaco2007 Nov]Cow Hurdles 奶牛跨栏

    1641: [Usaco2007 Nov]Cow Hurdles 奶牛跨栏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 424  Solved: 272 ...

  3. require和include的区别及自动加载的定义

    //引入文件//require与include的区别://include主要是指引入,如果引入的文件出现错误,则程序停止运行//require主要是指请求,如果请求的文件出现错误,则程序不受影响,继续 ...

  4. CentOs6系统安装mailx发邮件

    1. yum -y mail* sendmail* postfix* service sendmail start 2. cp /etc/mail.rc /etc/mail.rc.bak cat &g ...

  5. linux—粘滞位的设置

    粘滞位(Stickybit),或粘着位,是Unix文件系统权限的一个旗标.最常见的用法在目录上设置粘滞位,如此以来,只有目录内文件的所有者或者root才可以删除或移动该文件.如果不为目录设置粘滞位,任 ...

  6. 新人报道~cnblogs

    我的名字:杨先生 我的英文名:Allen 和你们一样,是一名程序猿,专业技能  C#.前端小块.

  7. HTTP相关整理(上)

    这次整理HTTP相关知识点的初衷是因为项目中有大量与网络请求相关的知识细节点,所以这次整理的更多的是日常中用得到的点(参考图解HTTP),另外给打算做FE的新人们一些建议:多重视网络这方面的知识.文章 ...

  8. Kubernetes日志收集

    关于kubernetes的日志分好几种,针对kubernetes本身而言有三种: 1.资源运行时的event事件.比如在k8s集群中创建pod之后,可以通过 kubectl describe pod ...

  9. IOS开发创建开发证书及发布App应用(八)——使用Application Loader工具上传应用

    8.使用Application Loader工具上传应用 继续第七步在iTunes所创建的应用,打开应用,如下图 点击详情按钮进去之后,单击右上角Ready to Upload Binary按钮,如下 ...

  10. 浅谈java类集框架和数据结构(2)

    继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...