【C语言】str类与men库函数的实现(如:strcpy,strcmp,strstr,strcat,memmove,memcpy)
https://blog.csdn.net/hanjing_1995/article/details/51539583
strcpy
拷贝源字符串到子字符串,包括‘\0’。
代码实现:
- char* strcpy(char* dst,const char* src)
- {
- assert(src);
- char* ret = dst;
- while (*src)
- {
- *dst = *src;
- src++;
- dst++;
- }
- *dst = '\0';
- return ret;
- }
2.strncpy:
strncpy与strcpy之间差别在于,strcpy将源字符串全部拷贝到新的字符串中,而strncpy拷贝长度由自己确定。
代码实现:
- char* strncpy(char* dst, const char* src, int count)
- {
- assert(dst);
- assert(src);
- char* ret = dst;
- while (count--)
- {
- *dst = *src;
- dst++;
- src++;
- }
- *dst = '\0';
- return ret;
- }
3.strcat:
strcat作用是链接字符串,即:
str1: hel str2:lo 则链接后为hello。
代码实现:
- char* strcat(char* dst, char* src)
- {
- assert(dst);
- assert(src);
- char* ret = src;
- while (*src)
- {
- src++;
- }
- while (*dst)
- {
- *src = *dst;
- dst++;
- src++;
- }
- *dst = '\0';
- return ret;
- }
4.strcmp:
strcmp用来比较字符串长度。
对两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到‘\0’为止。如果全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。
如果两个字符串都由英文字母组成,则有一个简单的规律:在英文字典中位置在后面的为“大”,还要特别注意:小写字母比大写字母“大”。
返回值:
(1)字符串1=字符串2,返回0
(2)字符串1>字符串2,返回一个正整数
(3)字符串1<字符串2,返回一个负整数。
代码实现:
- int strcmp(const char* dst, const char* src)
- {
- assert(dst);
- assert(src);
- while (*src&&*dst)
- {
- if (*src == *dst)
- {
- src++;
- dst++;
- }
- else
- {
- return *src - *dst - '\0';
- }
- }
- return *src - *dst - '\0';
- }
5.strncmp:
与strcmp区别在于:strcmp是针对整个字符串而言,而strncmp针对指定长度。
但是要注意,如果count比两者字符串长度都短的话,则要跳出循环结束。当长度大于两者字符串长度时,仍然可以比较出是否相等。
代码实现:
- int strncmp(const char* dst, const char* src,size_t count)
- {
- assert(dst);
- assert(src);
- while (count--&&*src&&*dst)
- {
- if (*src == *dst)
- {
- src++;
- dst++;
- }
- else
- {
- return *src - *dst - '\0';
- }
- }
- return *src - *dst - '\0';
- }
6.strstr:
寻找子字符串,我们在源字符串设置一个指针,用做来当此时确实满足是子串标志原串的位置,如下面的p。而s1,s2分别用作来遍历。
代码实现:
- char* strstr(const char* dst, const char* src)
- {
- assert(dst);
- assert(src);
- char* s1 = dst;
- char* p = src;
- char* s2 = p;
- while (*s2)
- {
- s1 = dst;
- s2 = p;
- while (*s2 && *s1)
- {
- if (*s2 == *s1)
- {
- s1++;
- s2++;
- }
- else
- {
- p++;
- break;
- }
- }
- if (*s1 == '\0')
- {
- return p;
- }
- }
- return NULL;
- }
7.memcpy:
strcpy完成字符串的拷贝,而对于非字符串类的,却要用memcpy完成内存拷贝。
代码实现:
- void* memcpy(void* dst, const void* src, size_t count)
- {
- assert(dst);
- assert(src);
- char* dst_ = (char*)dst;
- char* src_ = (char*)src;
- while (count--)
- {
- *dst_++ = *src_++;
- }
- //即使此时count不为0,但是当我们将原数拷贝到新的数据结束,那也要结束程序。
- *dst_ = '\0';//必须加上结束标志,否则会乱码
- return dst;
- }
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的优势所在。我们分情况即可解决。
代码实现:
- void memmove(void* dst, const void* src, size_t count)
- {
- assert(dst);
- assert(src);
- char* dst_ = (char*)dst;
- char* src_ = (char*)src;
- if (dst_ > src_&&dst < dst_ + count)
- {
- while (count--)
- {
- *(dst_+count) = *(src_+count);
- dst_++;
- src_++;
- }
- }
- else
- {
- while (count--)
- {
- *dst_ = *src_;
- dst_++;
- src_++;
- }
- }
- *dst_ = '\0';
- return dst;
- }
本文出自 “Han Jing's Blog” 博客,请务必保留此出处http://10740184.blog.51cto.com/10730184/1765040
【C语言】str类与men库函数的实现(如:strcpy,strcmp,strstr,strcat,memmove,memcpy)相关推荐
- c语言 strcpy原型,浅谈C语言中strcpy,strcmp,strlen,strcat函数原型
实例如下: //strcat(dest,src)把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0' char *strcat(char * strDest, cons ...
- C语言库函数的实现(strlen strcpy strcmp strcat strstr)
库函数的实现 strlen strcpy strcmp strcat strstr assert函数 头文件:assert.h 又称断言语句,可以看做是功能缩小版的 if 语句,它用于判断某个表达式的 ...
- C语言str系列库函数
C语言str系列库函数在不同的库中有不同的实现方法,但原理都是一样的.因为库函数都是没有进行入口参数检查的,并且str系列库函数在面试中经常容易被面试官喊在纸上写某一个函数的实现,因此本文参考了Ope ...
- 【Python】【Python库】Python3.7.2 - 字符串str类 (2)
文章目录 str类的其他方法 (Cont.) str.encode(encoding="utf-8", errors="strict") str.startsw ...
- c语言str相关的函数
C语言str系列库函数在不同的库中有不同的实现方法,但原理都是一样的.因为库函数都是没有进行入口参数检查的,并且str系列库函数在面试中经常容易被面试官喊在纸上写某一个函数的实现,因此本文参考了Ope ...
- c语言atof函数源码,【C语言】编纂函数实现库函数atof
[C语言]编写函数实现库函数atof //编写函数实现库函数atof #include #include #include #include double calculate(const char * ...
- css3 - 语言伪类选择器
1 <!DOCTYPE HTML> 2 <html lang="en-US"> 3 4 <head> 5 <meta charset=&q ...
- c语言存储类_C编程语言的存储类
c语言存储类 A variable's storage class tells us the following, 变量的存储类告诉我们以下内容: Where the variables would ...
- CSS 语言伪类选择器
语言伪类选择器,用来匹配使用指定语言的元素.对使用多语言版本的网站,可以根据不同语言版本,设置不同的样式. 表 2-9 语言伪类选择器 选择器 功能描述 版本 E:lang(language) 选择使 ...
最新文章
- 借双慧眼识别钓鱼欺诈网站
- 谷歌首提Android11,谷歌官方首次提及Android 11系统 谷歌推动安卓10.0系统下载
- mybatisgenerator使用_如何优雅地使用MyBatisplus
- mysql 高可用工具_MySQL Utilities 高可用工具体验
- 开发者应如何看待iOS平台和Android平台
- c语言用星号输出沙漏,《算法笔记》学习日记——3.3 图形输出
- Spring Security OAuth2.0_实现分布式认证授权_搭建网关工程_Spring Security OAuth2.0认证授权---springcloud工作笔记151
- 中国金属复合开关设备市场趋势报告、技术动态创新及市场预测
- ajax post data 获取不到数据,注意content-type的设置post/get
- java文本框内容覆盖6_java中读入一个TXT文件到文本框空如何覆盖以前读的内容?...
- ISA Server、虚拟机、托管服务器的使用
- python开发怎么成长_Python开发者四大进阶攻略,菜鸟的成神之路
- vba编写的出库单(可添加出库项目记录、生成、打印出库单)
- Revit二次开发——依据两条平曲线创建一条三维曲线
- ka电器表示什么意思_电路中FU、KM、KA、KT、KV、SA、FR和SB分别是什么电器元件的文字符号?...
- matlab找最大值,如何在MATLAB中的矩阵列中找到最大值的索引?
- 【前端进阶】-TypeScript类型声明文件详解及使用说明
- 前端vue几款模板介绍
- TencentOS tiny危险气体探测仪产品级开发
- 华为上机题-二师弟的星际加法
热门文章
- Linux在线扫描热添加的SCSI/iSCSI设备
- 初始Windows程序
- 由openSession、getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持
- 这是我第一题AC的线段树
- 小试---EF5.0入门实例1
- 写接口给别人调用 推送数据到我们_我们写了一个超好用的抖音矩阵数据管理工具...
- python字典的值可以是字典吗_python字典的值可以是字典吗
- python做自动化如何定位动态元素_python-web自动化-元素定位
- 华为畅享8plus停产了吗_牢记华为手机“三不买”原则,不花冤枉钱,选错要吃亏!...
- 液压支架销轴力学计算分析研究_基于RFID射频精准定位的智能开采研究与应用...