【C++ Primer | 0 】字符串函数实现
1. memcpy函数原型:
void* memcpy(void* dst, const void* src, size_t size);
void* memmove(void* dst, const void* src, size_t size);
分析:
- source和destin所指的内存区域可能重叠,但是如果source和destin所指的内存区域重叠,那么这个函数并不能够确保source所在重叠区域在拷贝之前不被覆盖。而使用memmove可以用来处理重叠区域。函数返回指向destin的指针.
- 如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。
- 注意:source和destin都不一定是数组,任意的可读写的空间均可。
函数实现:
void* memcpy(void* dst, const void* src, size_t size)
{if(dst == NULL || src == NULL){return NULL;}void* res = dst;char* pdst = (char*)dst;char* psrc = (char*)src;if(pdst > psrc && pdst < psrc + size) //重叠{pdst = pdst + size - 1;psrc = pdst + size - 1;while(size--)*pdst-- = *psrc--;}else //无重叠{while(size--)*dst++ = *src++;}return ret;
}
2. strpcy函数原型:
char *strcpy(char *dest, const char *src);
分析:
- dest:指向用于存储复制内容的目标数组。
- src:要复制的字符串。
- 返回值:该函数返回一个指向最终的目标字符串 dest 的指针。
函数实现:
char* strcpy(char* dst, const char* src)
{assert((dst != NULL) && (src != NULL));char* ret = dst;int size = strlen(src) + 1;if(dst > src || dst < src + len){dst = dst + size - 1;src = src + size - 1;while(size--) *dst-- = *src--;}else{while(size--) *dst++ = *src++;}return ret;
}
3. 手写strcat函数
char* strcat(char* dst, const char* src)
{char* ret = dst;while(*dst != '\0')++dst;while((*dst++ = *src) != '\0');return ret;
}
4. strcmp函数原型:
int strcmp(const char *s1, const char *s2);
返回值:
- 若s1、s2字符串相等,则返回零;
- 若s1大于s2,则返回大于零的数;否则,则返回小于零的数。
- 说明:strcmp()函数是根据ACSII码的值来比较两个字符串的;strcmp()函数首先将s1字符串的第一个字符值减去s2第一个字符,若差值为零则继续比较下去;若差值不为零,则返回差值。
函数实现:
int strcmp(const char* str1, const char* str2)
{while(*str1 == *str2 && *str1 != '\0'){++str1;++str2;}return *str1 - *str2;
}
5. 如何判断两个结构体是否相等?
- 判断两个结构体是否相等:重载操作符"=="
- 不能用函数memcmp来判断两个结构体是否相等:memcmp函数是逐个字节进行比较的,而struct存在字节对齐,字节对齐时补的字节内容是随机的,会产生垃圾值,所以无法比较。
int memcmp(const void *buf1, const void *buf2, unsigned int count);
分析:比较内存区域buf1和buf2的前count个字节。
返回值:
- 当buf1<buf2时,返回值小于0
- 当buf1==buf2时,返回值=0
- 当buf1>buf2时,返回值大于0
测试代码:
#include<iostream>using namespace std;struct s
{int a;int b;bool operator == (const s &rhs);
};bool s::operator == (const s &rhs)
{return ((a == rhs.a) && (b == rhs.b));
}int main()
{struct s s1, s2;s1.a = 1;s1.b = 2;s2.a = 1;s2.b = 2;if (s1 == s2)cout << "两个结构体相等" << endl;elsecout << "两个结构体不相等" << endl;return 0;
}
参考资料:
1.
【C++ Primer | 0 】字符串函数实现相关推荐
- MYSQL的函数有哪些?(3.字符串函数)
一.字符串函数的类别及其作用 字符串函数主要用来处理字符串数据,MySQL 字符串函数主要有计算字符长度函数.字符串合并函数.字符串转换函数.字符串比较函数以及查找指定字符串位置函数等. 如下表所类 ...
- C Primer Plus 第11章_字符串和字符串函数_代码和练习题
11.1 表示字符串和字符串I/O 字符串是以空字符(\0)结尾的char类型数据. strings1.c 演示在程序中表示字符串的几种方式 #include <stdio.h> #def ...
- C语言字符串函数----strcmp()函数用法
字符串函数<string.h> strcmp函数 strcmp()用于两个字符串的比较,如果相同则返回0,如果不相同则返回非零值. 函数原型 int strcmp(const char* ...
- C语言字符串函数----strcat()函数用法
字符串函数<string.h> strcat函数 strcat()函数用于拼接字符串 , 该函数接受两个字符串作为参数. 其函数原型 char *strcat (char *str1,co ...
- MySQL 学习笔记(3)— 字符串函数、数值函数、日期时间函数、流程函数、聚集函数以及分组数据
1. 字符串函数 MySQL 的常用函数包括字符串函数.数值函数.日期时间函数.流程函数等. SELECT ascii("abc"),char(97),concat("h ...
- mysql的字符串函数大全_MySQL的字符串函数大全
ASCII(str) 返回字符串str的最左面字符的ASCII代码值.如果str是空字符串,返回0.如果str是NULL,返回NULL. mysql> select ASCII('2'); -& ...
- c语言中存储字符用什么函数,那些C语言中你不知道的字符串函数(坑)
1.strcpy() 在字符串拷贝函数中,它的函数编写不难,如下 char* Strcpy(char* dest, const char* src) { assert(dest != NULL &am ...
- c int转字符串_【C++实现python字符串函数库】字符串匹配函数startswith与endswith
[C++实现python字符串函数库]字符串匹配函数startswith与endswith 这两个函数用于匹配字符串的开头或末尾,判断是否包含另一个字符串,它们返回bool值.startswith() ...
- 模拟实现常用字符串函数
1.查找子字符串函数strstr的实现char * my_strstr(const char * dest, const char * src)//const保护字符串不被更改 {assert(des ...
- PHP替换字符串函数strtr()和str_replace()
strtr(string,from,to): 逐个字符开始替换,以from跟to中长度较较短的一个为准,例如: strtr("aidenliu","ai",&q ...
最新文章
- 基于Python分析深圳程序员工资有多高?
- Spring-cloud-eureka-robbin-hystrix-feign
- 面试必问!有没有比读写锁更快的锁?
- [ZZ]职场白领必读:《如何成为PPT高手》(秋叶出品,完整版免费下载)
- IntellIJ IDEA 配置 Maven 以及 修改 默认 Repository
- 第十二节 VMware View 6.0 菜鸟入门 部署和安装2008 R2 RDS服务
- 新图表来袭,FineReport新增热力地图、漏斗图、图表切换新功能
- Spring Boot学习总结(25)——Spring Boot 资源初始化加载总结
- 初探在容器上构建持续部署!
- POJ 3761 Bubble Sort(乘方取模)
- 10. CSS 文本
- 非平衡数据(imbalanced data)简单介绍
- linux查看cpu与内存
- Android软件安全开发实践
- Tomcat JDBC Pool使用说明
- 详细描述NAND FLASH FTL 层算法
- MatLab常见函数和运算符号
- 企业Web安全防御:防火墙概述
- 横版格斗——技能动作概念
- Ubuntu操作-11 双显卡
热门文章
- 【线性代数公开课MIT Linear Algebra】 第二十三课 微分方程与exp(At)
- [转]javascript小技巧,超强推荐
- Java 队列清空,如何清空Actor死信队列 - java
- qt商业版和开源版的区别_微擎商业版系统V2.0.9全开源版纯净框架
- java牛客排序算法题_《剑指offer》面试题28:字符串的排列(牛客网版本) java...
- windows如何调用Linux的API,Windows和Native API中的系统调用?
- android 上下滚动文字_计算机毕设项目004之Android系统在线小说阅读器
- 《MySQL——临时表》
- lumanager mysql密码_LuManager单独安装mysqli
- 远控免杀专题(17)-Python-Rootkit免杀