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 】字符串函数实现相关推荐

  1. MYSQL的函数有哪些?(3.字符串函数)

    一.字符串函数的类别及其作用 字符串函数主要用来处理字符串数据,MySQL 字符串函数主要有计算字符长度函数.字符串合并函数.字符串转换函数.字符串比较函数以及查找指定字符串位置函数等. 如下表所类 ...

  2. C Primer Plus 第11章_字符串和字符串函数_代码和练习题

    11.1 表示字符串和字符串I/O 字符串是以空字符(\0)结尾的char类型数据. strings1.c 演示在程序中表示字符串的几种方式 #include <stdio.h> #def ...

  3. C语言字符串函数----strcmp()函数用法

    字符串函数<string.h> strcmp函数 strcmp()用于两个字符串的比较,如果相同则返回0,如果不相同则返回非零值. 函数原型 int strcmp(const char* ...

  4. C语言字符串函数----strcat()函数用法

    字符串函数<string.h> strcat函数 strcat()函数用于拼接字符串 , 该函数接受两个字符串作为参数. 其函数原型 char *strcat (char *str1,co ...

  5. MySQL 学习笔记(3)— 字符串函数、数值函数、日期时间函数、流程函数、聚集函数以及分组数据

    1. 字符串函数 MySQL 的常用函数包括字符串函数.数值函数.日期时间函数.流程函数等. SELECT ascii("abc"),char(97),concat("h ...

  6. mysql的字符串函数大全_MySQL的字符串函数大全

    ASCII(str) 返回字符串str的最左面字符的ASCII代码值.如果str是空字符串,返回0.如果str是NULL,返回NULL. mysql> select ASCII('2'); -& ...

  7. c语言中存储字符用什么函数,那些C语言中你不知道的字符串函数(坑)

    1.strcpy() 在字符串拷贝函数中,它的函数编写不难,如下 char* Strcpy(char* dest, const char* src) { assert(dest != NULL &am ...

  8. c int转字符串_【C++实现python字符串函数库】字符串匹配函数startswith与endswith

    [C++实现python字符串函数库]字符串匹配函数startswith与endswith 这两个函数用于匹配字符串的开头或末尾,判断是否包含另一个字符串,它们返回bool值.startswith() ...

  9. 模拟实现常用字符串函数

    1.查找子字符串函数strstr的实现char * my_strstr(const char * dest, const char * src)//const保护字符串不被更改 {assert(des ...

  10. PHP替换字符串函数strtr()和str_replace()

    strtr(string,from,to): 逐个字符开始替换,以from跟to中长度较较短的一个为准,例如: strtr("aidenliu","ai",&q ...

最新文章

  1. 基于Python分析深圳程序员工资有多高?
  2. Spring-cloud-eureka-robbin-hystrix-feign
  3. 面试必问!有没有比读写锁更快的锁?
  4. [ZZ]职场白领必读:《如何成为PPT高手》(秋叶出品,完整版免费下载)
  5. IntellIJ IDEA 配置 Maven 以及 修改 默认 Repository
  6. 第十二节 VMware View 6.0 菜鸟入门 部署和安装2008 R2 RDS服务
  7. 新图表来袭,FineReport新增热力地图、漏斗图、图表切换新功能
  8. Spring Boot学习总结(25)——Spring Boot 资源初始化加载总结
  9. 初探在容器上构建持续部署!
  10. POJ 3761 Bubble Sort(乘方取模)
  11. 10. CSS 文本
  12. 非平衡数据(imbalanced data)简单介绍
  13. linux查看cpu与内存
  14. Android软件安全开发实践
  15. Tomcat JDBC Pool使用说明
  16. 详细描述NAND FLASH FTL 层算法
  17. MatLab常见函数和运算符号
  18. 企业Web安全防御:防火墙概述
  19. 横版格斗——技能动作概念
  20. Ubuntu操作-11 双显卡

热门文章

  1. 【线性代数公开课MIT Linear Algebra】 第二十三课 微分方程与exp(At)
  2. [转]javascript小技巧,超强推荐
  3. Java 队列清空,如何清空Actor死信队列 - java
  4. qt商业版和开源版的区别_微擎商业版系统V2.0.9全开源版纯净框架
  5. java牛客排序算法题_《剑指offer》面试题28:字符串的排列(牛客网版本) java...
  6. windows如何调用Linux的API,Windows和Native API中的系统调用?
  7. android 上下滚动文字_计算机毕设项目004之Android系统在线小说阅读器
  8. 《MySQL——临时表》
  9. lumanager mysql密码_LuManager单独安装mysqli
  10. 远控免杀专题(17)-Python-Rootkit免杀