【C语言】字符串函数及其模拟实现

这是最好的时代,这是最坏的时代,我们一无所有,我们巍然矗立
本文由@睡觉待开机原创,未经允许不得转载。
本内容在csdn网站首发
欢迎各位点赞—评论—收藏
如果存在不足之处请评论留言,共同进步!

系列文章目录

注:由于系列文章没有完成,系列文章目录暂时欠缺。
C语言字符串函数及其模拟实现(本文章)
C语言中动态内存管理


文章目录

  • 系列文章目录
  • 前言
  • 1.字符分类函数
  • 2.字符转换函数
  • 3.strlen求字符串长度函数
    • 3.1strlen函数的使用(头文件:<string.h>)
    • 3.2strlen函数的模拟实现
  • 4.strcpy字符串拷贝函数
    • 4.1strcpy函数的使用
    • 4.2strcpy函数的模拟实现
  • 5.strcat函数
    • 5.1strcat函数的使用
    • 5.2strcat函数的模拟实现
  • 6.strcmp字符串比较函数
    • 6.1strcmp函数的使用
    • 6.2strcmp函数的模拟实现
  • 7.strncpy,strncat,strncmp函数
    • 7.1strncpy,strncat,strncmp
    • 7.2strcpy,strcat,strcmp与strncpy,strncat,strncmp的区别?
      • 7.2.1strncpy函数
      • 7.2.1strncat函数
      • 7.3strncmp函数
  • 8.strstr函数
    • 8.1strstr函数的使用
    • 8.2strstr函数的模拟实现
  • 9.strtok函数
    • 9.1strtok函数的基本语法
    • 9.2strtok函数的使用(代码)
  • 10.strerror与str
    • 10.1strerror
      • 10.1.1strerror函数的基本语法规则:
      • 10.1.2sterror函数的使用(代码):
    • 10.2perror函数
      • 10.2.1perror函数的基本语法(头文件:stdio.h)
      • 10.2.2perror函数的使用举例
  • 总结:


前言

字符是C语言中整形家族的一大特殊群体,其本质是ASCII码值进行转换的,其相关的常见库函数会在编写代码时提供一些便利,下面来简单看一下:


1.字符分类函数

字符分类函数,是对于全体字符进行分类的。
在这里插入图片描述
我们以isdigit函数语法为例,其他都是基本相同的
在这里插入图片描述

2.字符转换函数

常用的两个字符转换函数:
在这里插入图片描述

3.strlen求字符串长度函数

3.1strlen函数的使用(头文件:<string.h>)

在这里插入图片描述

#include<stdio.h>
#include<string.h>
//strlen函数返回值是size_t容易误用
int main()
{if (strlen("abc") - strlen("abcdef") > 0)//易错:3-6=?printf("surprise\n");elseprintf("normal\n");return 0;
}

3.2strlen函数的模拟实现

strlen函数实现有多种方式,下面简单介绍几种思路:
在这里插入图片描述

//strlen函数的模拟实现
size_t my_strlen1(char* str)
{size_t count = 0;while (*str++){count++;}return count;
}
size_t my_strlen2(char* str)
{char* start = str;while (*str++){;}return str - start - 1;
}
size_t my_strlen3(char* str)
{if (!*str){return 0;}elsereturn 1 + my_strlen3(++str);
}
int main()
{char str[] = "abcdef";size_t result1 = my_strlen1(str);size_t result2 = my_strlen2(str);size_t result3 = my_strlen3(str);printf("result of way1 = %zd\n", result1);printf("result of way2 = %zd\n", result2);printf("result of way3 = %zd\n", result3);return 0;
}

4.strcpy字符串拷贝函数

4.1strcpy函数的使用

功能:strcpy是将source字符串中的内容拷贝到destion中去,包括\0
在这里插入图片描述
返回值说明:如果拷贝成功,返回destion的地址;如果拷贝失败,返回NULL;

4.2strcpy函数的模拟实现

//strcpy函数的模拟实现
char* my_syrcpy(char* des, const char* src)
{char* start = des;while (*des++ = *src++){;}return start;
}
int main()
{char des[100] = {0};char src[] = "hello the world";//char* result1 = strcpy(des,src);char* result2 = my_syrcpy(des,src);//printf("result of library function is: %s\n", result1);printf("result of custom function  is: %s\n", result2);return 0;
}

5.strcat函数

5.1strcat函数的使用

功能:将source中的字符串追加到destion中字符串的后面去。
在这里插入图片描述
返回值说明:如果追加成功,返回destion的地址;如果拷贝失败,返回NULL;

5.2strcat函数的模拟实现

//strcat函数的模拟实现
char* my_strcat(char* str,const char* src)
{char* start = str;while (*str++){;}str--;while (*str++ = *src++){;}return start;
}
int main()
{char str[100] = "hello ";char src[] = "the world";//char* result1 = strcat(str,src);char* result2 = my_strcat(str, src);//printf("result1 of library function is : %s\n", result1);printf("result2 of custom function is : %s\n", result2);return 0;
}

6.strcmp字符串比较函数

6.1strcmp函数的使用

在这里插入图片描述

6.2strcmp函数的模拟实现

//strcmp函数的模拟实现
int my_strcmp(char* str1, char* str2)
{while (*str1 == *str2){if (*str1 == '\0'){return 0;}str1++;str2++;}if (*str1 > *str2)return 1;elsereturn -1;
}
int main()
{char str1[] = "abcdef";char str2[] = "abcq";int result = my_strcmp(str1,str2);if (result > 0)printf("str1 > str2\n");else if (result < 0)printf("str1 < str2\n");elseprintf("str1 = str2\n");return 0;
}

7.strncpy,strncat,strncmp函数

7.1strncpy,strncat,strncmp

strncpy,strncat,strncmp这三个函数基本与strcpy,strcat,strcmp函数语法基本是一致的,不过多了个参数,用来控制拷贝几个,追加几个,比较几个字符,相对strcpy,strcat,strcmp函数而言更加安全一些。这里不多赘述。

我们举一个例子说明这三个的基本语法:
在这里插入图片描述

7.2strcpy,strcat,strcmp与strncpy,strncat,strncmp的区别?

7.2.1strncpy函数

stencpy拷贝不会刻意加上\0,把原函数全部拷贝了如果还达不到程序员设置最大字符限制,补\0

7.2.1strncat函数

追加完字符串后,会主动追加一个\0,保证目标字符串是一个字符串。也就是说,他会追加n-1个字符还有1个’\0’。

不会超过原字符串的长度去追加。

7.3strncmp函数

这个就是限制了比较的长度而已,目前没发现什么区别。

8.strstr函数

8.1strstr函数的使用

strstr函数是干什么的?
功能:strstr函数是用来在一个字符串中找另一个字符串的第一次出现的地址的。
在这里插入图片描述
strstr函数的使用代码一览:

int main()
{char destion[] = "abcabbbbcd";char source[] = "bcd";char* result1 = strstr(destion, source);//char* result2 = my_strstr(destion, source);printf("the result of standard library is : %s", result1);//printf("the result of myself way is : %s", result2);return 0;
}

8.2strstr函数的模拟实现

char* my_strstr(const char* destion,const  char* source)
{char* cur = destion;char* s1 = NULL;char* s2 = NULL;//特殊情况,直接让我找个\0,我直接给他把目标字符串的地址给他返回去if (*source == '\0'){return destion;}while (*cur){s1 = cur;//每次cur变化时候,把s1初始化为cur开始的地方s2 = source;//每次cur变化的时候,把s2初始化为source开始的地方while (*s1 && *s2 && *s1 == *s2){s1++;s2++;}if (*s2 == '\0'){return cur;}cur++;}return NULL;}
int main()
{char destion[] = "abcabbbbcd";char source[] = "bcd";//char* result1 = strstr(destion, source);char* result2 = my_strstr(destion, source);//printf("the result of standard library is : %s", result1);printf("the result of myself way is : %s", result2);return 0;
}

9.strtok函数

9.1strtok函数的基本语法

首先第一个问题哈,strtok函数是干啥的?下面来揭示strtok函数的基本语法规则:
在这里插入图片描述

9.2strtok函数的使用(代码)

//strtok函数的使用
int main()
{char str1[] = "zhangsan/163@qq.com";char str2[] = "/@.";char* s1 = strtok(str1, str2);printf("%s\n", s1);s1 = strtok(NULL, str2);printf("%s\n", s1);s1 = strtok(NULL, str2);printf("%s\n", s1);s1 = strtok(NULL, str2);printf("%s\n", s1);return 0;
}

代码结果:
在这里插入图片描述
这样显然是可以使用strtok函数的,不过需要调用四次,是比较麻烦的,一般我们可以结合for循环进行使用:

//strtok函数结合for循环使用:
int main()
{char str1[] = "zhangsan/163@qq.com";char str2[] = "/@.";char* p = NULL;for (p = strtok(str1, str2); p != NULL; p = strtok(NULL, str2)){printf("%s\n", p);}return 0;
}

10.strerror与str

10.1strerror

10.1.1strerror函数的基本语法规则:

在这里插入图片描述

10.1.2sterror函数的使用(代码):

int main()
{int i = 0;for (i = 0; i <= 10; i++){printf("the %d error is :%s\n",i, strerror(i));}return 0;
}

其结果为:
在这里插入图片描述

这是0到10错误码翻译对应的信息。
一般我们是这样用的:

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{FILE* pFile;pFile = fopen("unexist.ent", "r");if (pFile == NULL)printf("Error opening file unexist.ent: %s\n", strerror(errno));return 0;
}

10.2perror函数

10.2.1perror函数的基本语法(头文件:stdio.h)

相对于strerror函数来说,更加直接
在这里插入图片描述

10.2.2perror函数的使用举例

#include <stdio.h>
#include <string.h>
#include<errno.h>
int main()
{FILE* pFile;pFile = fopen("unexist.ent", "r");if (pFile == NULL){//可以放开注释对比一下//printf("Error opening file unexist.ent of strerror: %s\n", strerror(errno));perror("Error opening file unexist.ent of perror");}return 0;
}

总结:

字符串函数是我们C语言常用的针对字符串操作的函数,有利于加深对字符串的理解。
感谢您阅读本文。如果您有任何问题或需要进一步了解,请随时联系我。祝您一切顺利!

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

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

相关文章

OpenSSL的源码在哪里下载?

官方网站去下载&#xff0c;网址&#xff1a; https://www.openssl.org/source/ 比较老的版本的下载页面地址&#xff1a; https://www.openssl.org/source/old/ 由于某面板的OpenSSL模块的安装配置语句如下&#xff1a; --with-openssl/root/rpmbuild/BUILD/openssl-1.0.2u所…

2-2基础算法-Nim和/前缀和/差分

文章目录 一.Nim和二.前缀和&区间和三.差分 一.Nim和 Nim游戏是一个数学策略游戏&#xff0c;通常涉及两名玩家轮流从几堆物品&#xff08;如石子或饼干&#xff09;中取走一定数量的物品。每个玩家每次可以从任意一堆中取走任意数量的物品&#xff0c;但必须至少取走一个…

使用qt实现四则运算计算机项目

这是我们要包含的头文件 #include <QWidget> #include<QStack> #include<string.h> #include<string> 这是我在ui界面创建的计算机基础框架。 接下来要实现按住每个按钮在白框内显示&#xff1b; 因此我们要定义一个QString 类型的变量 QString e…

Linux系统上64位ATT汇编语言多个源文件计算两个数的平方

运行程序的环境 sudo lsb_release -a看到操作系统是Ubuntu 22.04 LTS。 sudo uname -r看到内核版本是5.15.0-86-generic。 sudo as --version看到as的版本是2.38。 sudo ld --version看到ld的版本是2.38。 sudo gcc --version看到gcc版本是11.2.0。 sudo gdb --version看到gdb…

Yum仓库架构解析与搭建实践

1.Yum仓库搭建 1.1本地Yum仓库图解 1.2Linux本地仓库搭建 配置本地光盘镜像仓库 1&#xff09;挂载 [roothadoop101 ~]# mount -t iso996 /dev/cdrom/mnt 2&#xff09;查看 [rooothadoop101 ~] # df -h | |grep -i mnt /dev/sr0 4.6G 4.4G 3&#xf…

服务器上配置jupyter,提示Invalid credentials如何解决

我是按照网上教程在服务器上安装的jupyter以及进行的密码配置&#xff0c;我利用 passwd()这个口令生成的转译密码是"argon...."。按照教程配置jupyter notebook配置文件里面的内容&#xff0c;登陆网页提示"Invalid credentials"。我谷歌得到的解答是&…

学生选课系统基础版

目录 一.Java 中的集合框架&#xff08;上&#xff09; 1.Java中的集合框架概述 2.Collection接口&接口简介 3.学生选课——创建学生类和课程类 4.学生选课——添加课程Ⅰ 5.学生选课——添加课程Ⅱ 6.学生选课——课程查询 7.学生选课——课程修改 8.学生选课——课程删…

EduSoho教培系统 任意文件读取漏洞复现(CNVD-2023-03903)

0x01 产品简介 EduSoho教培系统是由杭州阔知网络科技有限公司研发的开源网校系统 0x02 漏洞概述 该教培系统classroom-course-statistics接口存在未授权任意文件读取漏洞,通过该漏洞攻击者可以读取到config/parameters.yml文件的内容,拿到该文件中保存的secret值以及数据库…

ShenYu网关Http服务探活解析

文章目录 网关端服务探活admin端服务探活 Shenyu HTTP服务探活是一种用于检测HTTP服务是否正常运行的机制。它通过建立Socket连接来判断服务是否可用。当服务不可用时&#xff0c;将服务从可用列表中移除。 网关端服务探活 以divide插件为例&#xff0c;看下divide插件是如何获…

Java监听器与观察者模式

Java监听器与观察者模式 Java中的监听器&#xff08;Listener&#xff09;和观察者模式&#xff08;Observer Pattern&#xff09;都是用于处理对象间的事件通知和响应的设计模式。它们的目的是在对象之间建立一种松散的耦合&#xff0c;使得一个对象的状态变化可以通知到其他…

vue中element-ui日期选择组件el-date-picker 清空所选时间,会将model绑定的值设置为null 问题 及 限制起止日期范围

一、问题 在Vue中使用Element UI的日期选择组件 <el-date-picker>&#xff0c;当你清空所选时间时&#xff0c;组件会将绑定的 v-model 值设置为 null。这是日期选择器的预设行为&#xff0c;它将清空所选日期后将其视为 null。但有时后端不允许日期传空。 因此&#xff…

Kubernetes 容器编排(1)

前言 知识扩展 早在 2015 年 5 月&#xff0c;Kubernetes 在 Google 上的搜索热度就已经超过了 Mesos 和 Docker Swarm&#xff0c;从那儿之后更是一路飙升&#xff0c;将对手甩开了十几条街,容器编排引擎领域的三足鼎立时代结束。 目前&#xff0c;AWS、Azure、Google、阿里云…

使用 PyTorch FSDP 微调 Llama 2 70B

引言 通过本文&#xff0c;你将了解如何使用 PyTorch FSDP 及相关最佳实践微调 Llama 2 70B。在此过程中&#xff0c;我们主要会用到 Hugging Face Transformers、Accelerate 和 TRL 库。我们还将展示如何在 SLURM 中使用 Accelerate。 完全分片数据并行 (Fully Sharded Data P…

深入学习 C++编程,数据结构与算法关系

数据结构是计算机科学中非常重要的概念之一。它是一种组织和存储数据的方式&#xff0c;能够有效地操作和管理数据&#xff0c;以便提高算法的效率。 以下是一些为什么要有数据结构的原因&#xff1a; (1) 数据组织&#xff1a;数据结构可以帮助我们组织和管理大量的数据。通过…

【elementui笔记:el-table表格的输入校验】

之前做得比较多的校验是在el-form表单里做的&#xff0c;但有时也遇到&#xff0c;需要在table内输入数据&#xff0c;然后校验输入的数据是否符合要求的情况。因此记录一下。 思路&#xff1a; 1.需要借助el-form的校验&#xff0c;el-table外层嵌套一层el-form&#xff0c;使…

世界5G大会

会议名称:世界 5G 大会 时间:2023 年 12 月 5 日-12 月 8 日 地点:河南郑州 一、会议简介 世界 5G 大会,是由国务院批准,国家发展改革委、科技部、工 信部与地方政府共同主办,未来移动通信论坛联合属地主管厅局联合 承办,邀请全球友好伙伴共同打造的全球首个 5G 领域…

CleanMyMac X2024值不值得下载?

macOS已经成为最受欢迎的桌面操作系统之一&#xff0c;它提供了直观、简洁的用户界面&#xff0c;使用户可以轻松使用和管理系统。macOS拥有丰富的应用程序生态系统&#xff1b;还可以与其他苹果产品和服务紧密协作&#xff0c;如iPhone、iPad&#xff0c;用户可以通过iCloud同…

# 和 $ 的区别②

上节博客说了使用 # 的时候,如果参数为 String ,会自动加上单引号 但是当参数为String 类型的时候,也有不需要加单引号的情况,这时候用 # 那就会出问题 比如根据 升序(asc) 或者 降序(desc) 查找的时候,加了单引号那就会报错 这个时候我们就只能使用 $ 如果看不懂代码,就去…

jmeter,同一线程组内,调用cookie实现接口关联

取cookie方式参考上一篇&#xff1a;jemeter&#xff0c;取“临时重定向的登录接口”响应头中的cookie-CSDN博客 元件结构 登录后要执行的接口为“api/get_event_list/”&#xff0c;在该HTTP请求下创建HTTP信息头管理器&#xff0c;配置如下&#xff1a; 执行测试后&#xff0…

Docker网络模式:深度理解与容器网络配置

Docker 的网络模式是容器化应用中一个关键而复杂的方面。本文将深入讨论 Docker 的网络模式&#xff0c;包括基本概念、常用网络模式以及高级网络配置&#xff0c;并通过更为丰富和实际的示例代码&#xff0c;帮助读者全面掌握如何理解和配置容器网络。 Docker网络基础 1 Doc…