前言

本篇文章主要学习一下常见的库函数和模拟实现这些库函数,这篇文章可以加深我们对这些函数的理解。

一、strlen

这个函数是用来求字符串长度的,实现逻辑是: ‘\0’ 作为字符串的结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包
含 ‘\0’ )。返回值类型为无符号整形。
我们来看一下这个函数如何用:


这个用起来并不难,传首元素地址过去,就能计算出字符串的长度。下面我们来看一下strlen的模拟实现:

#include <stdio.h>
#include <assert.h>
#include <string.h>
size_t my_strlen(const char *p)     //计数器法
{    int count = 0;assert(p != NULL);while (*p != '\0'){count++;p++;}return count;
}
int main(){char arr[] = "abcde";
unsigned int len=my_strlen(arr);
printf("%d", len);return 0;
}

这里加入了assert和const分别来保证不为空指针和字符串不被修改。

二、strcpy

这个函数的功能是实现字符串的拷贝,举例:把字符串2的内容拷贝到字符串1里面去


注意:1.源字符串必须以\0结束。
2.会将\0拷贝过去。
3.目标空间必须够大,确保能存放的下源字符串的内容。
4.目标空间必须可变。
我们再来看一下strcpy函数的模拟实现:
代码:

#include <stdio.h>
#include <string.h>
#include <assert.h>
char * my_strcpy(char *p1, const char *p2) {assert(p1 && p2);char* ret = p1;   while (*p1++ = *p2++){;}return ret;
}
int main(){char arr1[10] = {0};char arr2[] = "abcde";printf("%s", my_strcpy(arr1, arr2));return 0;
}

这里注意,由于strcpy函数的返回类型为目标空间的起始地址。

所以我们刚开始要把起始地址保存起来,作为函数的返回值。
还有我们用assert断言p1和p2不能为空指针。const限制字符串的内容不能被改变,这些都是需要注意的点。

三丶strcat

这个函数的作用是字符串追加,把一个字符串的内容放到另一个字符串后面去,我们来举个例子:


这就是这个函数大体的用法。
这个函数有几个需要注意的地方:1.源字符串必须以 ‘\0’ 结束。
2.目标空间必须有足够的大,能容纳下源字符串的内容。
3. 目标空间必须可修改。
下面我们来模拟实现一下这个函数:
代码:

#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcat(char* p1, char* p2) {assert(p1 && p2);  //确保p1和p2不为空指针char ret = p1;while (*p1){p1++;      //找到第一个数组中的\0}while (*p1++ = *p2++){;           //从第一个数组的\0开始,把第二个数组中的元素追加过去。}return ret;
}
int main(){char arr1[20] = "hello";char arr2[] = "world";my_strcat(arr1, arr2);printf("%s",arr1 );return 0;
}

结果和上边的一样,说明我们的模拟的代码是正确的。

四丶strcmp

这个函数是比较字符串大小的。
注意:这里比较的规则不是比较字符串长度,而是比较对应位置上字符的ASCII码值的大小,如果第一个位置相等,就去比较下一对,直到不相等或者都遇到了\0。
这个函数的返回值为整数(int):如果都相等,返回0,大于的话返回大于0的数,小于的话返回小于0的数。
这是msdn上对这个函数返回值的解释:

我们来举个例子:

arr1末尾的o的ASCII值是要大于arr2末尾的a的,所以返回大于0的数。

我们当前编译器返回的是1。
我们下面来学习一下如何模拟实现这个函数:
代码:

#include <stdio.h>
#include <string.h>
#include <assert.h>
int my_strcmp(const char* p1, const char* p2)
{assert(p1 && p2);while (*p1 == *p2){if (*p1 == '\0')return 0;p1++;p2++;}if (*p1 > *p2){return 1;}
}
int main(){char arr1[] = "hello";char arr2[] = "hella";int ret=my_strcmp(arr1, arr2);printf("%d",ret );return 0;
}

运行结果和上面也是一样的,说明我们的代码逻辑没有问题。

五丶strstr

strstr这个函数可以理解为查找字符串,返回第一次找到目标字符串的首元素地址,如果找不到就返回空指针,下面这个图片是msdn上对strstr这个函数返回值的解释。


我们来举个例子:

由于在arr1中找到了arr2中的cdef,所以这里返回c的地址,然后打印出来,打印的是c和后面的字符串,我们来看一下运行结果:

下面我们也是对这个函数进行模拟实现:
代码:

#include <stdio.h>
#include <string.h>
char* my_strstr(char* p1, char* p2) {char* s1 = p1;char* s2 = p2;char* cur = p1;while (*cur){s1 = cur;s2 = p2;while (*s1 == *s2 && *s1 && *s2){s1++;s2++;}if (*s2 == '\0'){return cur;}cur++;}return NULL;
}
int main() {char arr1[] = "abcdefhij";char arr2[] = "cdef";char* ret = my_strstr(arr1, arr2);printf("%s", ret);return 0;
}

运行结果和上面的是一致的,说明代码逻辑是正确的。

总结

本篇文章学习了C语言常用的库函数,这些函数会对我们以后写代码有所帮助。
本篇文章内容结束,感谢大家观看。如果意见或建议,可以在评论区留言,您的点赞是我更新的动力。我们下篇文章再见。

C语言strlen,strcpy ,strcat, strcmp,strstr常用库函数的理解与模拟实现相关推荐

  1. 缓存区的输入输出,字符串常用操作,实现strlen/strcpy/strcat/strcmp函数)

    输出缓冲区: 程序输入的数据并不能立即显示在屏幕上,而是先存储在输出缓冲区中,满足一些条件后才显示出来. 1.遇到\n后 2.遇到输入语句 3.当输出缓冲区满4K 4.当程序结束 5.手动刷新 ffl ...

  2. strlen,strcpy,strcat,strcmp函数

    1.strlen函数 strlen函数的作用是计算给定字符串的长度,从内存的某个位置开始,遇到第一个'\0'结束. 使用样例: int main() {const char *ar = "a ...

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

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

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

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

  5. 用子函数实现strlen.strcpy.strcat.strcmp(完整代码)

    strlen思路 循环遍历数组(字符串),直至第i位等于尾零'\0',循环结束:定义一个变量 在循环内自加 strcat思路 循环遍历第一个字符串,找到末尾,'\0'的位置,然后将第二个字符串,从头开 ...

  6. C语言程序设计 | 模拟实现字符串操作函数:strlen, strcmp, strcpy, strcat, strchr, strstr

    模拟实现字符串和内存操作函数(一)目录: strlen strcpy strcat strcmp strstr strchr strlen size_t strlen(const char* str) ...

  7. 字符串处理函数(strcpy strcat strcmp strlen)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.字符串复制函数 strcpy 二.字符串连接函数 strcat 三.字符串比较函数strcmp 四..求字符串长度 ...

  8. C++字符串操作函数strstr,strcmp,strlen,strcpy,strcat,strok

    C++中字符串操作函数非常常见,下面是一些常用的str相关操作函数: strstr strstr: 在字符串中查找子字符串 C++ const char* strstr(const char* str ...

  9. C/C++中strlen(),strcpy(),strcat()以及strcmp()的代码实现--学习笔记

    以下代码是自己学习过程中通过借鉴加上自己的理解编写出的代码已经在VC++2008版本上调试通过,主函数因为很简单所以没有附上. 1. strlen() int my_strlen(char *str) ...

最新文章

  1. Synchronize读脏
  2. 数据结构与算法之前缀数
  3. scrapy.Spider的属性和方法
  4. Datawhale 三月组队学习计划
  5. Python学习之==线程进程
  6. [Android]Notification汇总
  7. spring报“Could not resolve placeholder”错误
  8. 移动通信原理B-------例题解答3
  9. 【C语言】C语言实现泛型编程
  10. 计算机网络期末考试代做,代做计算机作业-易指做帮写网
  11. Footprint:Polkadot创立至今,生态如何?
  12. 腾讯实习生笔试到面试的经历
  13. csdn 问答使用与测评
  14. 操作系统的基本特征、区别及功能
  15. Git develop分支的一些操作
  16. 暗黑类游戏的设计概念
  17. word 编辑过程中变为只读_WPS?教程 | WPS?云办公如何多人协同编辑
  18. 计算机网络stp和utp,关于网络线UTP FTP STP SFTP 屏蔽层区别
  19. 又一百度杰出科学家离职,百度研究院成中国AI的黄埔军校
  20. SwiftUI 界面大全之个人简历界面支持自定义字体(教程含源码)

热门文章

  1. 论文 MiNet: Mixed Interest Network for Cross-Domain Click-Through Rate Prediction
  2. Visio Professional之活动图
  3. 创建PDB的两种操作
  4. html如何滚动闪烁,ActiveX flicker ,ActiveX控件闪烁,在html中,只要有滚动条,一滚动就闪烁...
  5. [应用智能2022] 面向开放设施的基于 MANET 的推荐系统
  6. 最小二乘法,加权最小二乘法,迭代重加权最小二乘法 (含代码)【最小二乘线性求解】
  7. Jinja2常用模板语言(条件判断if,循环遍历for,过滤器)
  8. idea+Gradle使用教程
  9. 中国酒店向精品个性化发展
  10. safari 删除插件