目录

一.常用字符串函数介绍

1.strlen

2. strcpy

3.strcmp

4.strcat

5.strstr

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

1.strlen

2.strcpy

3.strcmp

4.strcat

5.strstr


一.常用字符串函数介绍

1.strlen

字符串strlen是用来求字符串长度的,我们可以打开cpp网站查看有关信息

该函数用来求字符串长度,求的是‘\0’之前字符的个数,函数参数为字符指针,因为该函数不需要修改字符串的值,故为了保护字符串被意外修改,设置为只读,所以在参数字符指针用const修饰,返回值即为字符串的长度,

下面以经典helloworld字符串为例:

输出结果:

字符串arr1为“helloworld”,一个10个字符,该字符串长度则为10,输出结果正确

2. strcpy

字符串函数strcpy是用来拷贝字符串的,即将一个字符串的内容拷贝到另一个字符串中,而且会将该字符的'\0'也拷贝到另一个字符串中,我们打开cpp网站查看该函数的有关信息

该函数的参数为两个字符指针,一个指向目标字符串,一个指向源字符串,由于只需要修改目标字符串,故用const修饰源字符串以防止误修改,函数返回值是目标字符串的首地址

下面以经典helloworld字符串为例:

输出结果:

可以看到我们将arr2中的helloworld成功地拷贝到了arr1中,但特别值得注意的是,当目标字符串空间不够时,强行拷贝比空间更大的字符串,虽然也可以输出结果,但毕竟是越界访问,会引发一些不可估计的问题,如将本例的arr1大小由10改为5:

可以看到程序运行后,虽然正常地打印出了结果,但是程序出错了

3.strcmp

字符串函数strcmp函数是用来比较两个字符串大小的,但是并不是比较两个字符串的大小,而是比较字符串的内容,如果第一个字符串小于第二个字符串,则返回一个小于0的值,大于则返回一个大于0的值,等于则返回0,如“hello”和“hellz”,前面的字符都相等,‘o’小于‘z’,故"hello"小于“hellz”,如“hellx”和"hella",前面的字符都相等,'x'大于'a',所以“hellx”大于“hella”

打开cpp网站查看该函数的相关信息

该函数的参数为两个字符指针,由于比较不需要修改字符串,所以两个参数都用const修饰以防误修改 返回值为int型,比较的结果为小于则为小于0的值,大于则为大于0的值,等于则为0

下面以经典的helloworld字符串为例

输出结果:

 arr1小于arr2,故输出的结果为-1,arr3大于arr4,故输出的结果为1,arr5等于arr6,故输出的结果为0

4.strcat

字符串函数strcat是用来连接两个字符串的,即将源字符串连接到目标字符串后面,连接的步骤是先找到目标字符串的末尾‘\0’,然后再进行拷贝,所以与strcpy的区别就在于要从目标字符串的末尾开始拷贝

打开cpp网站查看该函数的相关信息:

该函数的参数为两个字符指针,由于源字符串不需要修改,故加上const修饰以防误修改,返回值为连接后的字符串的地址,即目标字符串的地址

下面以经典的helloworld字符串为例:

输出结果

可以看到我们成功地将arr2的“world”连接到arr1的“hello”中,于是arr1便变成了“helloworld”,与拷贝函数类似,特别值得注意的是,目标字符串要有足够大的空间,否则强行连接的话会出现一些未知的错误

我们将上例的arr1的大小改为8:

输出结果:

可以看到虽然正常输出了,但是程序报错了

5.strstr

字符串函数strstr是查找函数,在字符串中查找子串并返回子串在字符串第一次出现的地址,如果找不到子串则返回NULL

打开cpp网站查看该函数的相关信息

该函数的参数为两个字符指针。由于查找并不需要修改两个字符串的内容,所以两个字符指针都用const修饰,返回值为子串在字符串中第一次出现的地址

下面以经典的helloworld字符串为例:

输出结果:

可以看到“llo”可以在“helloworld”中找到,并返回指向“llo”’的地址,将改地址用%s打印,则从llo开始打印 ,即为lloworld

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

1.strlen

my_strlen模拟实现库函数strlen。参数为const char *,返回值为int型,即为字符串的长度,利用遍历字符串的方法,直到‘\0’结束遍历

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int my_strlen(const char* str)
{int len = 0;//定义长度,初始化为0while (*str != '\0')//从头开始遍历字符串,直到'\0'结束{len++;str++;}return len;//返回字符串的长度
}
int main()
{char arr1[] = "helloworld";int ret = my_strlen(arr1);printf("%d", ret);return 0;
}

2.strcpy

利用my_strcpy模拟实现库函数strcpy,依次赋值,直到源字符串遍历到'\0"结束赋值,并返回预留的目标字符串的地址

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
char* my_strcpy(char* str1, const char* str2)
{char* p = str1;   //定义一个p指针保存str1,以便函数结束时返回while (*str1 = *str2)//依次赋值,直到*str2为'\0'结束{str1++;str2++;}return p;//返回预留的指针P
}
int main()
{char arr1[20] = {0};char arr2[] = "helloworld";char *str = my_strcpy(arr1,arr2);printf("%s", str);return 0;
}

3.strcmp

利用my_strcmp函数模拟实现库函数strcmp,依次遍历比较,如果遇到不相等的情况则直接return返回,如果两个字符串相等,则遍历到'\0'再返回0

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int my_strcmp(const char* str1, const char* str2)/*要是不相等,下面的return会结束循环,
要是相等,则遍历到'\0'才结束*/
{while (*str1 != '\0' || *str2 != '\0'){if (*str1 < *str2)   //小于则返回-1return -1;else if (*str1 > *str2)//大于则返回1return 1;else if (*str1 == *str2)//相等则继续比较后面的字符{str1++;str2++;}}return 0;//只有相等才会执行到这一步,即相等返回0
}
int main()
{char arr1[] = "helloworla";char arr2[] = "helloworld";int ret = my_strcmp(arr1,arr2);printf("%d", ret);return 0;
}

4.strcat

利用my_strcat函数模拟实现库函数strcat,先找到目标字符串的末尾‘\0’,然后从'\0'处依次赋值,直达遍历到源字符串的末尾'\0'

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
char* my_strcat(char* str1, const char* str2)
{char* p = str1;//保存连接字符串的地址,以便函数结束时返回while (*str1 != '\0')//遍历找到str1的'\0'处{str1++;}while (*str1 = *str2)//从str1的'\0'处依次赋值,直到遍历到str2的'\0'结束{str1++;str2++;}return p;//返回连接后字符串的地址
}
int main()
{char arr1[20] = "hello";char arr2[] = "world";char *str = my_strcat(arr1,arr2);printf("%s", str);return 0;
}

5.strstr

利用my_strstr函数模拟实现库函数strstr,设置两个指针分别指向两个字符串,再设置一个指针P指向当前开始比较的字符的位置,直到遍历到子串的'\0'位置则已找到子串并返回子串的位置,循环节后仍咩=没有找到子串则说明找不到子串,返回NULL

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
char* my_strstr(const char* str1, const char* str2)
{const char* s1 = str1;//定义s1指向第一个字符串const char* s2 = str2;//定义s2指向第二个字符串const char* p = str1;//定义p指向第一个字符串当前开始比较的字符while (*p){s1 = p;   //从p处开始比较s2 = str2;//从头开始比较while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)//判断遍历字符是否相等{s1++;s2++;}if (*s2 == '\0')//如果是因为*s2为'\0'结束,则证明找到子串,返回子串的位置return p;p++;//一轮比较后没有找到子串,则从下一个字符开始比较}return NULL;
}
int main()
{char arr1[] = "helloworld";char arr2[] = "llo";char *str = my_strstr(arr1,arr2);printf("%s", str);return 0;
}

用c语言模拟实现常用字符串函数相关推荐

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

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

  2. C语言常用字符串函数及模拟实现

    字符串函数总结及模拟实现 1. 字符串函数总结

  3. C语言常用字符串函数strlen、strcpy、strcat、strcmp、strchr

    C语言常用字符串函数,求串长strlen(char *s).串复制strcpy(char *s1,char *s2).串连接strcat(char *s1,char *s2).串比较strcmp(ch ...

  4. C语言常用字符串函数

    概括 代码 #include<stdlib.h> #include<stdio.h> #include<string.h> int main() {//常用字符串函 ...

  5. c语言中有哪些函数关系,C语言中有哪些常用的函数

    C语言中有哪些常用的函数 发布时间:2020-11-17 17:01:32 来源:亿速云 阅读:107 作者:小新 这篇文章主要介绍C语言中有哪些常用的函数,文中介绍的非常详细,具有一定的参考价值,感 ...

  6. SQL常用字符串函数

    SQL常用字符串函数 一.字符转换函数 1.ASCII() 返回字符表达式最左端字符的ASCII 码值.在ASCII()函数中,纯数字的字符串可不用''括起来,但含其它字符的字符串必须用''括起来使用 ...

  7. 字符串与字符串函数 - 字符串输出 常用字符串函数

    一.字符串输出函数 1.puts() 函数 使用较为简单,只需要将字符串的地址作为参数进行传递即可. #include <sthio,h> #define DEF "I am a ...

  8. Matlab命令集--常用字符串函数

    Matlab命令集--常用字符串函数 常用函数 eval  :运行字符串表示的表达式 char  :将数组变成字符串 double:将数字字符串变成数字 字符串操作 deblank :去掉字符串末尾的 ...

  9. php如果字符串有1 3 5,PHP常用字符串函数小结

    PHP常用字符串函数小结 来源:程序员人生   发布时间:2015-01-22 09:02:32 阅读次数:1594次 1.判断类型的函数 is_bool() //判断是不是为布尔型 is_float ...

最新文章

  1. 信息学奥赛一本通(1195:判断整除)
  2. hibernate一对多映射实现
  3. lnmp的php.ini,lamp/lnmp优化3--phpini
  4. 中介者模式android,Android[高级教程] 设计模式之六 中介者模式(二)
  5. 【Linux】复制文件到当前目录 / 复制文件并重命名到当前目录
  6. DLL load failed while importing _sqlite3: 找不到指定的模块。
  7. 如何linux删除文件夹,Linux系统下如何删除文件夹
  8. 最新幸运盒子幸运砸金蛋微信盲盒游戏源码
  9. 基于51的LCD1602计算器
  10. 读内存为什么比读取磁盘快?快多少?
  11. 自学渗透测试:使用 DVWA 和 SQLmap 探寻 SQL 注入攻击与防范
  12. top 与 margin-top的区别
  13. js添加、删除DOM元素
  14. [解读REST] 1.REST的起源
  15. C 语言实例 - 输入n个整数,使其从大到小输出
  16. GeoTools之入门简介
  17. TABLE functions
  18. 厚积薄发,你只有付出!(编程之始)
  19. 贪吃蛇c语言代码图片,【图片】C语言小游戏~贪吃蛇【c语言吧】_百度贴吧
  20. Android 接口回调实例

热门文章

  1. Android编译出现FAILED: setup-jack-server问题的解决办法
  2. 无限火力机器人一拳流出装_文森特玩无限火力想快乐,试玩AD机器人后傻了:这是一拳超人?...
  3. 使用小程序做交互的技巧(演讲内容实录)丨掘金开发者大会
  4. Uber与Lyft:与其说是生意,不如说是幻想
  5. 跳跃的小怪兽 Splay
  6. 基于微信小程序的评选投票系统软件的设计与实现毕业论文
  7. 12306订票助手插件拖垮GitHub事件原因始末
  8. 按头安利 好看又实用的虚幻UE场景模型素材看这里
  9. 独热编码python实现_独热编码(one-hot coding)
  10. java mapper层_Java 通用Mapper的设计