写在前面:本文比较长,覆盖了c语言中较多的字符串函数,作者会先带各位了解标准库对函数的介绍,然后模拟实现相关功能。

strlen

求字符串长度

size_t表明返回一个无符号类型的数字,是因为考虑到length为非零整数
const 可以保护str指向的那块空间不被改变,因为我们只是去求字符串的长度,而不会去解引用改变内容

注意

看这样一段代码

#include<stdio.h>
#include <string.h>
int main(void)
{if (strlen("ab") - strlen("abc") > 0){printf(">");}else{printf("<");}return 0;
}

打印结果为“>”
原因是strlen的返回值是无符号类型的,此处结果是应该一个负数,在内存中存的是补码,但和0比较的时候,由于是无符号类型,所以被解读为一个很大的数字,远远大于了0

模拟

方法1(计数器)

#include <stdio.h>
#include <assert.h>
int my_strlen(const char* p)
{assert(p);int ret = 0;while (*p++){ret++;}return ret;
}
int main(void)
{char* p = "string";printf("%d ", my_strlen(p));return 0;
}

方法2(递归)

//2.递归
int my_strlen(const char* p)
{if (*p)return 1 + my_strlen(++p);elsereturn 0;
}

方法3(指针-指针)

这种方法和VS2022库函数文件里的写法一样,所以我们参考微软工程师的代码

size_t __cdecl strlen (const char * str)
{const char *eos = str;while( *eos++ ) ;return( eos - str - 1 );
}

strcpy

拷贝字符串

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main(void)
{char* arr1 = "abcd";char arr2[20] = { 0 };strcpy(arr2, arr1);printf("%s", arr2);return 0;
}

注意

如你所见,

1.arr2是被拷贝的空间,要求可以改变,应该是数组,而对源字符串不作要求,可以是字符指针指向的字符串常量,也可以是数组。

2.拷贝字符串以源字符串中的‘\0’结束。

可验证:

3.作为合格的程序员,你得保证目标空间可以存下你要拷贝的东西。(不要写bug)

模拟

char* my_strcpy(char* dest, const char* src)
{assert(dest && src);char* p = dest;while (*dest++ = *src++);return p;
}
int main(void)
{char arr1[] = "abcdd";char arr2[20] = { 0 };my_strcpy(arr2, arr1);printf("%s", arr2);return 0;
}

strcat

字符串追加

这个函数对’\0’要求很大,目标字符串和源字符串都得有’\0’。

模拟

char* my_strcat(char* dest, const char* src)
{assert(dest && src);char* p = dest;while (*dest) {dest++;}while (*dest++ = *src++);return p;
}

注意

不要拿这个函数给自己追加,因为会覆盖\0,不能结束追加。

strcmp

是他!就是他!

比较字符串大小
需要对返回值做一下说明:

比如“abcdef”和
"abu’,虽然前者比后者在长度上大得多,但比较字符串是对应位置依次比较,在‘u’和’c’处u> c,所以比较结束,前者小于后者,返回一个小于零的值

话不多说,直接模拟

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* p1, const char* p2)
{assert(p1 && p2);while (*p1 == *p2){p1++;p2++;}if (!*p1)return 0;elsereturn *p1 - *p2;
}
int main(void)
{char* p = "tomota";char* q = "tomoto";if (my_strcmp(p, q) > 0)printf(">");else if (my_strcmp(p, q) < 0)printf("<");elseprintf("=");return 0;
}

strncpy

说明

正常使用

你非要写BUG

目标空间不够用,你非要拷?

小手一抖,一个BUG

既然不够,拿0来凑

strncat

追加时,覆盖0,自己补0

你看看这小子就不做舔狗


这小子发现自己“追”不上,就给了0然后跑路了

strncmp

很简单,多的一个参数就是用来指定比较前“几”个字符
自己用着看

strlen,strcpy,strcmp,strcat,strncpy,strncmp,strncat相关推荐

  1. strlen, strcpy,strcmp,strcat,strncpy,strncmp,strncat,strst库函数的详细解析以及模拟实现

  2. C语言库函数的实现(strlen strcpy strcmp strcat strstr)

    库函数的实现 strlen strcpy strcmp strcat strstr assert函数 头文件:assert.h 又称断言语句,可以看做是功能缩小版的 if 语句,它用于判断某个表达式的 ...

  3. 字符串函数实现(strlen,strcpy,strcmp,strcat,strrev)

    声明:以下代码可能并非最佳方法,若有错误疑问欢迎提出!!! strlen函数 #include<stdio.h> #include<string.h>int mylen(cha ...

  4. 【C语言】字符串库函数的解读和模拟实现第一弹(strlen、strcpy、strcat、strcmp、strncpy、strncat 及 strncmp)

    目录 一. strlen函数 1.1 strlen函数实现的功能及函数原型 1.1.1 strlen函数实现的功能 1.1.2 strlen的函数原型 1.1.3 strlen实现功能的更进一步解读 ...

  5. C基础--字符串操作函数(strlen,strcpy,strcmp,strcat,strstr,strtok,strchr)

    #include <stdio.h> #include <string.h> int main(void) {//char dest[10];//#define NULL (v ...

  6. c语言strcpy两字符串长度不同,(C语言)自己写字符串操作函数(一)——strlen/strcpy/strcat/strcmp/st...

    看到很多面试都会要求你写一些简单的字符串操作函数,这些函数看起来挺简单的,但是自己写的时候就会发现不少的问题.所以我自己把大部分的字符串操作函数都写了一遍,然后用了个测试程序来测试自己写的函数与库函数 ...

  7. 《C语言杂记》理解字符串处理函数 strlen() strcpy() strcat() strcmp()

    在linux C 编程中,我们经常遇到字符串的处理,最多的就是字符串的长度.拷贝字符串.比较字符串等:当然现在的C库中为我们提供了很多字符串处理函数.熟练的运用这些函数,可以减少编程工作量,这里介绍几 ...

  8. c语言 strcpy原型,浅谈C语言中strcpy,strcmp,strlen,strcat函数原型

    实例如下: //strcat(dest,src)把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0' char *strcat(char * strDest, cons ...

  9. C和指针之字符串之strlen、strcpy、 strcat、strcmp使用总结

    1.常见字符串相关操作 我们知道有strlen. strcpy.strcat.strcmp.这样一一系列函数 2.实现Demo #include <stdio.h> #include &l ...

最新文章

  1. SpringIOC源码分析总结
  2. Linux下udp程序怎么运行,Linux下UDP的连接程序示例(阻塞、非阻塞)
  3. vb编程入门_【高能】用VB开发的彩票选号软件
  4. visual studio 2005,visual studio 2008调出即时窗口
  5. flash加载flv,本地测试正常,上传至空间则失败解决办法
  6. 成功解决ValueError: Dimension 1 in both shapes must be equal, for ‘Assign_8‘ (op: ‘Assign‘) with input s
  7. 蓝桥杯java第七届决赛第一题--愤怒小鸟
  8. YumRepo Error: All mirror URLs are not using ftp, http[s] or file. Eg. /HTML/ 标签: yum 2014-05-26
  9. python列表添加数字_Python-识别列表中的连续数字组
  10. (转)关于同步和异步的理解(ajax网络编程)
  11. T4模板——一个神奇的代码生成器
  12. 【Web文件上传下载】各种类型文件对应的content-type
  13. oracle goldengate director,Oracle GoldenGate Director安装和配置
  14. 清华天才王垠受邀面试阿里P9,被P10面跪后网上怒发文,惨打325的P10赵海平回应了!...
  15. 2021-03-25--通信网的身份认证与鉴权机制
  16. python日程表代码_【算法提高班】《我的日程安排表》系列
  17. 《数据驱动 从方法到实践》之 数据驱动的环节 学习总结
  18. python时间函数纳秒_python – 获取纳秒级精度的文件修改时间
  19. dellr320故障_用于对 PowerEdge 服务器进行高级故障处理的诊断工具
  20. 彩灯控制单片c语言程序,基于51单片机的led彩灯设计。 9个灯(红绿蓝三色)。按键控制 c语言程序...

热门文章

  1. 分享腾讯官方二维码生成接口地址
  2. 国标流媒体服务器可以接入海康摄像头吗?是否会有断流问题?
  3. 在Linux下运行你的第一个汇编程序
  4. swf文件解析(一) 文件header部分解析
  5. 风水树笔记之四:拖稿一年的开心网研究,互联网营销
  6. 英语的简洁著名商品经典广告主题句
  7. spotfire and matlab,MATLAB 提供对 TIBCO Spotfire 的支持 - MATLAB Simulink
  8. [Ext4] Ext4文件系统分析系列文章
  9. unity3D海底珊瑚礁、珊瑚岛场景和海底植物岩石素材素材包
  10. nodejs实现阿里云短信验证码