【C语言】str类与men库函数的实现(如:strcpy,strcmp,strstr,strcat,memmove,memcpy)

https://blog.csdn.net/hanjing_1995/article/details/51539583

  1. strcpy

拷贝源字符串到子字符串,包括‘\0’。

代码实现:

[cpp] view plaincopy
  1. char* strcpy(char* dst,const char* src)  
  2. {  
  3.     assert(src);  
  4.     char* ret = dst;  
  5.     while (*src)  
  6.     {  
  7.         *dst = *src;  
  8.         src++;  
  9.         dst++;  
  10.     }  
  11.     *dst = '\0';  
  12.     return ret;  
  13. }  



2.strncpy:

strncpy与strcpy之间差别在于,strcpy将源字符串全部拷贝到新的字符串中,而strncpy拷贝长度由自己确定。

代码实现:

[cpp] view plaincopy
  1. char* strncpy(char* dst, const char* src, int count)  
  2. {  
  3.     assert(dst);  
  4.     assert(src);  
  5.     char* ret = dst;  
  6.     while (count--)  
  7.     {  
  8.         *dst = *src;  
  9.         dst++;  
  10.         src++;  
  11.     }  
  12.     *dst = '\0';  
  13.     return ret;  
  14. }  


3.strcat:

strcat作用是链接字符串,即:

str1: hel    str2:lo    则链接后为hello。

代码实现:

[cpp] view plaincopy
  1. char* strcat(char* dst, char* src)  
  2. {  
  3.     assert(dst);  
  4.     assert(src);  
  5.     char* ret = src;  
  6.     while (*src)  
  7.     {  
  8.         src++;  
  9.     }  
  10.     while (*dst)  
  11.     {  
  12.         *src = *dst;  
  13.         dst++;  
  14.         src++;  
  15.     }  
  16.     *dst = '\0';  
  17.     return ret;  
  18. }  


4.strcmp:

strcmp用来比较字符串长度。

对两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到‘\0’为止。如果全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。
如果两个字符串都由英文字母组成,则有一个简单的规律:在英文字典中位置在后面的为“大”,还要特别注意:小写字母比大写字母“大”。
返回值:
(1)字符串1=字符串2,返回0
(2)字符串1>字符串2,返回一个正整数
(3)字符串1<字符串2,返回一个负整数。

代码实现:

[cpp] view plaincopy
  1. int strcmp(const char* dst, const char* src)  
  2. {  
  3.     assert(dst);  
  4.     assert(src);  
  5.     while (*src&&*dst)  
  6.     {  
  7.         if (*src == *dst)  
  8.         {  
  9.             src++;  
  10.             dst++;  
  11.         }  
  12.         else  
  13.         {  
  14.             return *src - *dst - '\0';  
  15.         }  
  16.     }  
  17.     return *src - *dst - '\0';  
  18. }  


5.strncmp:

与strcmp区别在于:strcmp是针对整个字符串而言,而strncmp针对指定长度。

但是要注意,如果count比两者字符串长度都短的话,则要跳出循环结束。当长度大于两者字符串长度时,仍然可以比较出是否相等。

代码实现:

[cpp] view plaincopy
  1. int strncmp(const char* dst, const char* src,size_t count)  
  2. {  
  3.     assert(dst);  
  4.     assert(src);  
  5.     while (count--&&*src&&*dst)  
  6.     {  
  7.         if (*src == *dst)  
  8.         {  
  9.             src++;  
  10.             dst++;  
  11.         }  
  12.         else  
  13.         {  
  14.             return *src - *dst - '\0';  
  15.         }  
  16.     }  
  17.     return *src - *dst - '\0';  
  18. }  


6.strstr:

寻找子字符串,我们在源字符串设置一个指针,用做来当此时确实满足是子串标志原串的位置,如下面的p。而s1,s2分别用作来遍历。

代码实现:

[cpp] view plaincopy
  1. char* strstr(const char* dst, const char* src)  
  2. {  
  3.     assert(dst);  
  4.     assert(src);  
  5.     char* s1 = dst;  
  6.   
  7.     char* p = src;  
  8.     char* s2 = p;  
  9.   
  10.     while (*s2)  
  11.     {  
  12.         s1 = dst;  
  13.         s2 = p;  
  14.         while (*s2 && *s1)  
  15.         {  
  16.             if (*s2 == *s1)  
  17.             {  
  18.                 s1++;  
  19.                 s2++;  
  20.             }  
  21.             else  
  22.             {  
  23.                 p++;   
  24.                 break;  
  25.             }  
  26.         }  
  27.         if (*s1 == '\0')  
  28.         {  
  29.             return p;  
  30.         }  
  31.     }  
  32.     return NULL;  
  33. }  


7.memcpy:

strcpy完成字符串的拷贝,而对于非字符串类的,却要用memcpy完成内存拷贝。

代码实现:

[cpp] view plaincopy
  1. void* memcpy(void* dst, const void* src, size_t count)  
  2. {  
  3.     assert(dst);  
  4.     assert(src);  
  5.     char* dst_ = (char*)dst;  
  6.     char* src_ = (char*)src;  
  7.     while (count--)  
  8.     {  
  9.         *dst_++ = *src_++;  
  10.     }  
  11.     //即使此时count不为0,但是当我们将原数拷贝到新的数据结束,那也要结束程序。  
  12.     *dst_ = '\0';//必须加上结束标志,否则会乱码  
  13.     return dst;  
  14. }  


8.memmove:

memmove在于它可解决内存重叠问题。

如:将1,2,3,4,5,6,7,8中的1,2,3,4移动到3,4,5,6位置。那么则仍然按照memcpy则会,将1移动到3处,2移动到4处,再准备移动3时发现此时的3已经由于被移动到此处的1覆盖而丢失。4同理。这就是memmove的优势所在。我们分情况即可解决。

代码实现:

[cpp] view plaincopy
  1. void memmove(void* dst, const void* src, size_t count)  
  2. {  
  3.     assert(dst);  
  4.     assert(src);  
  5.     char* dst_ = (char*)dst;  
  6.     char* src_ = (char*)src;  
  7.     if (dst_ > src_&&dst < dst_ + count)  
  8.     {  
  9.         while (count--)  
  10.         {  
  11.             *(dst_+count) = *(src_+count);  
  12.             dst_++;  
  13.             src_++;  
  14.         }  
  15.     }  
  16.     else  
  17.     {  
  18.         while (count--)  
  19.         {  
  20.             *dst_ = *src_;  
  21.             dst_++;  
  22.             src_++;  
  23.         }  
  24.     }  
  25.     *dst_ = '\0';  
  26.     return dst;  
  27. }  


本文出自 “Han Jing's Blog” 博客,请务必保留此出处http://10740184.blog.51cto.com/10730184/1765040

个人分类: C语言

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【笔试常考】C语言:深度剖析strlen,sizeof

https://blog.csdn.net/hanjing_1995/article/details/51539532在之前的博客中&#xff0c;我也探索过strlen,sizeof区别&#xff0c;详情可见博客http://10740184.blog.51cto.com/10730184/1705820。关于strlen,sizeof均可求字符串长度&#xff0c;这两者是笔试面试常考的知识…

vim环境配置 +vimplus配置

vim配置 参考网站&#xff1a;传送门 这个网站详细说明了vim配置的命令&#xff0c;我挑选了我想要用的部分&#xff0c;自己配置了一下。 配置vim的文件有两个&#xff0c;一个是/etc/vim/vimrc 这个是系统配置文件&#xff0c;修改这个文件将会修改所有用户的vim环境&…

剑指offer面试题:替换空格

https://blog.csdn.net/yanxiaolx/article/details/52235212题目&#xff1a;请实现一个函数&#xff0c;把字符串中的每个空格替换成“%20”。例如输入“We are happy.”&#xff0c;则输出“We%20are%20happy.”。解析&#xff1a;时间复杂度为O(n)的解法。完整代码及测试用例…

数据库原理及应用【一】引言

什么是数据库&#xff1a;一个大规模的集成的数据集合 作用&#xff1a;描述现实世界的实体(entities)以及实体之间的关系 管理数据库的系统软件&#xff1a;DBMS 文件是一个平滑的字符流&#xff0c;无法完成信息的检索和管理 数据&#xff08;data&#xff09;:用来描述现…

Linux命令【三】gcc编译+静态库+动态库+makefile+gdb调试

用C编译器编译源文件&#xff1a;gcc 源文件 -o 可执行文件名 详细步骤&#xff1a; gcc -E a.c -o a.i预处理器将头文件展开&#xff0c;宏替换&#xff0c;去掉注释gcc -S a.i -o a.s编译器将C文件变成汇编文件gcc -c a.s -o a.o汇编器将会变文件变成二进制文件gcc a.o -o a…

用c++模拟实现一个学生成绩管理系统

https://blog.csdn.net/yanxiaolx/article/details/53393437题目&#xff1a;用c模拟实现一个学生成绩的信息管理系统&#xff0c;要求能添加、删除、修改、查看和保存学生的信息等功能 源代码如下:[cpp] view plaincopy#define _CRT_SECURE_NO_WARNINGS #include<iostr…

Linux命令【四】文件+虚拟内存+常用系统函数

File*其实是一个结构体 文件描述符FD&#xff1a;索引到对应的磁盘文件文件读写位置指针FP_POS&#xff0c;如果同时读写需要注意文件指针的位置I/O缓冲区BUFFER&#xff1a;保存内存指针&#xff0c;默认大小是8kb&#xff0c;用于减小我们对硬盘操作的次数。因为我们对硬盘的…

Python3列表

操作&#xff1a;索引、切片、加、乘、检查成员、确定序列长度、确定最大最小元素 定义&#xff1a; 列表名 [元素]下标列表名[x] 截取:列表名[x:y] 更新&#xff1a; list[x]y 或者使用append()方法添加列表项删除&#xff1a; del list[x]常用操作&#xff1a; 截取与…

Linux惊群效应详解(最详细的了吧)

https://blog.csdn.net/lyztyycode/article/details/78648798?locationNum6&fps1 linux惊群效应详细的介绍什么是惊群&#xff0c;惊群在线程和进程中的具体表现&#xff0c;惊群的系统消耗和惊群的处理方法。1、惊群效应是什么&#xff1f;惊群效应也有人叫做雷鸣群体效应…

epoll原理详解(最清晰)

https://blog.csdn.net/lyztyycode/article/details/79491419我只是把内容搬运过来做个记录&#xff0c;方便自己以后回头看。第一部分&#xff1a;select和epoll的任务关键词&#xff1a;应用程序 文件句柄 用户态 内核态 监控者要比较epoll相比较select高效在什么地方&#x…

Linux命令【五】系统函数

系统文件函数 stat函数 指针如果没有const一般表示传出参数&#xff0c;如果加const表示传入参数 struct stat dev_t st_dev文件设备编号ino_t st_ino节点 inode号是唯一的&#xff0c;每个inode节点的大小一般是128字节活着256字节&#xff0c;一般文件每2KB就设置一个ino…

生产者-消费者模型的两种实现方式

https://www.cnblogs.com/caolicangzhu/p/7086176.html本文主要来总结生产者-消费者模型的代码实现,至于其原理,请大家自行百度. 一、基于链表的生产-消费模型(条件变量)我们以链表为例,生产者进行头部插入,消费者进行头部删除,因此,先将链表相关操作封装为LinkList.h,具体代码…

Linux系统【一】CPU+MMU+fork函数创建进程

切板中的内容输出到文件### 进程相关概念 程序&#xff1a;编译好的二进制文件&#xff0c;在磁盘上&#xff0c;不占用系统资源&#xff08;不包括磁盘&#xff09;。&#xff08;剧本&#xff09; 进程&#xff1a;占用系统资源&#xff0c;是程序的一次运行。&#xff08;戏…

Ubuntu卸载软件

用过使用dpkg软件管理工具得到所有已经安装的软件&#xff0c;如果不清楚软件的全名可以使用grep命令进行查找 然后再使用sudo apt-get remove --purge 软件名卸载软件&#xff08;--purge参数会删除配置文件&#xff0c;删的干净一些&#xff09; 例如&#xff1a;

一个重要且实用的signal---SIGCHLD

https://blog.csdn.net/lyztyycode/article/details/78150805SIGCHLD(修改)因为笔者之前的文章里面有错误&#xff0c;今天发现&#xff0c;立马做个修改。在下面我的一段关于sigchld信号相对于直接调用wait函数的好处时&#xff0c;我说调用wait函数要一直检测子进程是否执行完…

数据结构实验之链表七:单链表中重复元素的删除

https://blog.csdn.net/blessingxry/article/details/794455111.知识点&#xff1a;逆序建立链表&#xff0b;节点删除 2.题意&#xff1a;按照数据输入的相反顺序&#xff08;逆位序&#xff09;建立一个单链表&#xff0c;并将单链表中重复的元素删除&#xff08;值相同的元素…

Python3函数和代码复用

函数的定义 def 函数名([参数列表]):注释函数体注意事项 函数形参不需要声明类型&#xff0c;可以使用return语句在结束函数执行的同时返回任意类型的值&#xff0c;函数返回值类型与return语句返回表达式i的类型一致 即使该函数不需要接受任何参数&#xff0c;也必须保留一堆…

一文说尽C++赋值运算符重载函数(operator=)

http://www.cnblogs.com/zpcdbky/p/5027481.html在前面&#xff1a;关于C的赋值运算符重载函数(operator)&#xff0c;网络以及各种教材上都有很多介绍&#xff0c;但可惜的是&#xff0c;内容大多雷同且不全面。面对这一局面&#xff0c;在下在整合各种资源及融入个人理解的基…

Python a和a[:]的区别

简单来讲a[:]是深复制&#xff0c;a是浅复制&#xff0c;相当于赋值a的话是赋值了指针&#xff0c;赋值a[:]相当于复制了a对应的那段空间 例如&#xff1a; a [1,1,1,1,1,1]for x in a:if x1:a.remove(x)print(a)运行结果&#xff1a; remove操作是移除序列中第一个x元素。…

约瑟夫环(c语言程序完整版)

https://blog.csdn.net/m_hahahaha1994/article/details/51742453约瑟夫环&#xff08;约瑟夫问题&#xff09;是一个数学的应用问题&#xff1a;已知n个人&#xff08;以编号1&#xff0c;2&#xff0c;3…n分别表示&#xff09;围坐在一张圆桌周围。从编号为k的人开始报数&am…