进阶C语言-字符函数和字符串函数

在这里插入图片描述

字符函数和字符串函数

  • 🎈1.函数介绍
    • 🔎1.1strlen函数
      • 🔭1.1.1strlen函数的模拟实现
        • 📖1.计数器法
        • 📖2.递归法
        • 📖3.指针-指针
    • 🔎1.2strcpy函数
      • 🔭1.2.1strcpy函数的模拟实现
    • 🔎1.3strcat函数
      • 🔭1.3.1strcat函数的模拟实现
    • 🔎1.4strcmp函数
      • 🔭1.4.1strcmp函数的模拟实现
    • 🔎1.5strncpy函数
    • 🔎1.6strncat函数
    • 🔎1.7strncmp函数
    • 🔎1.8strstr函数

🎈1.函数介绍

🔎1.1strlen函数

在这里插入图片描述
✅注意事项:

  • 字符串以'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包括'\0'
  • 参数指向的字符串必须以'\0'结束
  • 注意函数的返回值是size_t,是无符号的
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
//库函数
//strlen用来求字符串长度
//本质上是统计字符串中\0之前的字符个数
int main()
{const char* str = "abcdef";size_t len1 = strlen(str);size_t len2 = strlen("abcdef");size_t len3 = strlen("abc\0edf");printf("%d\n", len1);printf("%d\n", len2);printf("%d\n", len3);return 0;
}

✅运行示例:
在这里插入图片描述

🔭1.1.1strlen函数的模拟实现

📖1.计数器法

assert函数作用是断言,断言是一种除错机制,用于验证代码是否符合编码人员的预期。编码人员在开发期间应该对函数的参数、代码中间执行结果合理地使用断言机制,确保程序的缺陷尽量在测试阶段被发现。使用assert函数时需要添加头文件#include <assert.h>.
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* str)//字符串是放在常量字符串中,不能被改变,所以这里最好用用const修饰一下
{assert(str != NULL);//p如果接收过来的是空指针,那么这里运行会崩溃的,所以这里用assert函数断言一下int count = 0;//计数while (*str != '\0'){count++;//当它的字符不等于'\0'时,计数加一str++;//再往下一个字符找}return count;
}
int main()
{const char* str = "abcdef";printf("%d", my_strlen(str));return 0;
}

✅运行示例:
在这里插入图片描述

📖2.递归法
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* str)
{assert(str != NULL);if (*str != '\0'){return 1 + my_strlen(str + 1);}elsereturn 0;
}
int main()
{const char* str = "abcdef";printf("%d", my_strlen(str));return 0;
}

✅运行示例:
在这里插入图片描述

📖3.指针-指针
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* str)
{assert(str != NULL);const char* start = str;//定义一个指针放字符串首字符的地址,因为*str接收的字符串为常量字符串,所以这里最好也用const修饰一下while (*str != '\0'){str++;}return str - start;
}
int main()
{const char* str = "abcdef";printf("%d", my_strlen(str));return 0;
}

✅运行示例:
在这里插入图片描述

🔎1.2strcpy函数

在这里插入图片描述

  • 源字符串必须以'\0'结束
  • 会将源字符串中的'\0'拷贝到目标空间
  • 目标空间必须足够大,以保证能存放源字符串
  • 目标空间必须可变
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{char arr1[10] = { 0 };char arr2[10] = "Hello";printf("%s\n", strcpy(arr1, arr2));return 0;
}

✅运行示例:
在这里插入图片描述
在这里插入图片描述
注:strcpy函数会将源字符串中的'\0'拷贝到目标空间。

🔭1.2.1strcpy函数的模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* src)
{char *ret = dest;assert(dest && src);while (*dest++ = *src++){;}return ret;
}
int main()
{char arr1[20] = { 0 };char arr2[] = "Hello";printf("%s\n",my_strcpy(arr1, arr2));return 0;
}

✅运行示例:
在这里插入图片描述

🔎1.3strcat函数

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = "Hello";char arr2[] = "World";printf("%s\n", strcat(arr1, arr2));return 0;
}

✅运行示例:
在这里插入图片描述

🔭1.3.1strcat函数的模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
char* my_strcat(char* dest, char* src)
{char* ret = dest;while (*dest != '\0'){dest++;}while (*dest++ = *src++){;}return ret;
}
int main()
{char arr1[20] = "Hello";char arr2[] = "World";printf("%s\n", my_strcat(arr1, arr2));return 0;
}

✅运行示例:
在这里插入图片描述
注意:

  • 目标空间必须足够大,还需要可以修改。
  • 目标空间必须得有'\0'(保证找到目标空间的末尾)。
  • 源字符串中也得有'\0',在拷贝时将源字符串中的'\0'也要拷贝过去。

🔎1.4strcmp函数

在这里插入图片描述

  • 第一个字符串大于第二个字符串,返回大于0的数字。
  • 第一个字符串小于第二个字符串,返回小于0的数字。
  • 第一个字符串等于第二个字符串,返回0。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{char arr1[] = "Hello";char arr2[] = "World";printf("%d\n", strcmp(arr1, arr2));return 0;
}

✅运行示例:
在这里插入图片描述

🔭1.4.1strcmp函数的模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int my_strcmp(const char* str1, const char* str2)
{while (*str1 == *str2){str1++;str2++;}if (*str1 > *str2)return 1;elsereturn -1;
}
int main()
{char arr1[] = "Hello";char arr2[] = "World";printf("%d\n", my_strcmp(arr1, arr2));return 0;
}

✅运行示例:
在这里插入图片描述

🔎1.5strncpy函数

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = { 0 };char arr2[] = "World";printf("%s\n", strncpy(arr1, arr2,3));return 0;
}

✅运行示例:
在这里插入图片描述

🔎1.6strncat函数

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = "hi";char arr2[] = "World";printf("%s\n", strncat(arr1, arr2, 3));return 0;
}

✅运行示例:
在这里插入图片描述

🔎1.7strncmp函数

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = "Worle";char arr2[] = "World";printf("%d\n", strncmp(arr1, arr2, 3));return 0;
}

✅运行示例:
在这里插入图片描述

🔎1.8strstr函数

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{char arr1[] = "abcdefghi";char arr2[] = "op";char* ret = strstr(arr1, arr2);if (ret == NULL){printf("找不到!\n");}else{printf("%s\n", ret);}return 0;
}

✅运行示例:
在这里插入图片描述
在这里插入图片描述

好啦,关于字符串函数的知识到这里就先结束啦,后期会继续更新学习C语言的相关知识,欢迎大家持续关注、点赞和评论!❤️❤️❤️

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

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

相关文章

Linux系统编程 day07 信号

Linux系统编程 day07 信号 1. 信号的介绍以及信号的机制2. 信号相关函数2.1 signal2.2 kill2.3 abort和raise2.4 alarm2.5 setitimer 3. 信号集4. 信号捕捉函数6. SIGCHLD信号7. SIGUSR1与SIGUSR2 1. 信号的介绍以及信号的机制 信号是信息的载体&#xff0c;在Linux/Unix环境下…

如何有效的进行 E2E

一、前言 本文作者介绍了什么是E2E测试以及E2E测试测什么&#xff0c;并从对于被测系统、测试用例、测试自动化工具、测试者四个方面的要求&#xff0c;介绍了如何保证E2E测试有效性&#xff0c;干货满满&#xff0c;值得学习。 二、什么是E2E测试 相信每一个对自动化测试感…

需求不明确的情况下,测试该如何处理?

当需求不明确的情况下&#xff0c;测试团队可以采取以下措施来处理&#xff1a; 1. 与项目团队进行沟通&#xff1a;测试团队应与项目团队密切合作&#xff0c;与业务分析师、产品经理等相关人员进行沟通&#xff0c;以获取更多的需求细节和背景信息。通过与相关方的交流&…

zookeeper 客户端常用命令简单记录(实操课程系列--watcher功能测试)(发布订阅功能测试)

本系列是zookeeper相关的实操课程&#xff0c;课程测试环环相扣&#xff0c;请按照顺序阅读测试来学习zookeeper。阅读本文之前&#xff0c;请先阅读----zookeeper 单机伪集群搭建简单记录&#xff08;实操课程系列&#xff09; 1、命令行工具切换到zookeeper的bin目录下面&am…

springboot自定义校验注解的实现

自定义校验注解的实现 通过谷粒商城项目学习了自定义校验器的实现一、编写自定义校验注解二、自定义注解的校验器三、关联自定义的校验器和自定义的校验注解总结 通过谷粒商城项目学习了自定义校验器的实现 近日在学习雷神的谷粒商城项目&#xff0c;其中有一个自定义校验的实…

国外客户跟我要佣金,该给不该给?

“Jack&#xff0c;这次你要是不帮我&#xff0c;我就死定了&#xff01;” 收到美国公司采购Antony的信息时&#xff0c;我有些哭笑不得&#xff0c;因为在我电脑屏幕上除了他的信息外&#xff0c;还有来自他公司监察部门的邮件&#xff1a; “jack先生&#xff0c;我们调查…

二极管钳位电路的作用

1、使用钳位二极管的瞬态保护即将输出电压限定在某个区间 钳位二极管不仅仅是为了改变电压基线。它们在缓解瞬态事件方面非常有用&#xff0c;尤其是ESD和雷电浪涌。例如&#xff0c;当输入电压高于 Vh 时&#xff0c;D1 正向偏置。因此&#xff0c;过多的电流流过 D1 而不是负…

Linux Centos系统安装Mysql8.0详解

本文是基于服务器Linux Centos 8.0系统 安装 Mysql8.0真实运维工作实战为例&#xff0c;详细讲解安装的全过程。 1&#xff0c;检查卸载mariadb Mariadb数据库是mysql的分支&#xff0c;mariadb和mysql会有冲突&#xff0c;所以安装Mysql前&#xff0c;首先要检查是否安装了m…

java学习part23异常try catch

124-异常处理-异常的概述与常见异常的举例_哔哩哔哩_bilibili 1.异常 2.try catch 3.finally 类似golang的defer 一定执行的语句

7-1 哈夫曼树与哈夫曼编码

哈夫曼树与哈夫曼编码 题目描述输入格式输出格式输入样例输出样例 分数 30 作者 伍建全 单位 重庆科技学院 题目描述 哈夫曼树(Huffman Tree)又称最优二叉树&#xff0c;是一种带权路径长度最短的二叉树。所谓树的带权路径长度&#xff0c;就是树中所有的叶结点的权值乘上其到…

为什么要在项目中使用TypeScript?

随着越来越多的开发人员采用TypeScript&#xff0c;人们需要了解在下一个项目中应该使用TypeScript的原因。尽管它在早期应用中遇到了一些阻力&#xff0c;但在过去十年&#xff0c;它迅速成为一种广泛使用的编程语言。 以下介绍如何使用TypeScript以及它给开发人员带来的一些好…

堆在排序中的应用

堆排序 1、堆排序原理 堆排序是利用到了堆这种数据结构&#xff0c;我们首先回顾一下二叉堆的特性&#xff1a; 最大堆的堆顶是整个堆中的最大元素。最小堆的堆顶是整个堆中的最小元素。 以最大堆为例&#xff0c;如果删除一个最大堆的堆顶&#xff08;并不是完全删除&…

如何利用树莓派与Nginx结合内网穿透服务实现远程访问内部站点——“cpolar内网穿透”

文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 安装 Nginx&#xff08;发音为“engine-x”&#xff09;可以将您的树莓派变成一个强大的 Web 服务器&#xff0c;可以用于托管网站或 Web 应用程序。相比其他 Web 服务器&#xff0c;Ngi…

Electron+Ts+Vue+Vite桌面应用系列:TypeScript常用语法详解

文章目录 1️⃣ TypeScript常用讲解1.1 使用1.2 字符串1.3 数字1.3 布尔1.4 数组1.5 元组1.6 枚举1.7 any1.8 void1.9 object1.10 函数指定返回值的类型1.11 联合类型1.12 类型断言1.13 接口1.14 函数类型1.15 类类型1.16 泛型 2️⃣ 类2.1 类的基本写法2.2 类的继承2.3 类的修…

数据结构 | 二叉树的概念及前中后序遍历

数据结构 | 二叉树的概念及前中后序遍历 文章目录 数据结构 | 二叉树的概念及前中后序遍历一、树概念及结构1.1 树的相关概念 二、树的表示2.2 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 三、二叉树概念及结构3.1 二叉树的基本概念3.2 二叉树的结构&a…

文档理解的新时代:LayOutLM模型的全方位解读

一、引言 在现代文档处理和信息提取领域&#xff0c;机器学习模型的作用日益凸显。特别是在自然语言处理&#xff08;NLP&#xff09;技术快速发展的背景下&#xff0c;如何让机器更加精准地理解和处理复杂文档成为了一个挑战。文档不仅包含文本信息&#xff0c;还包括布局、图…

熟练运用这些黑盒测试知识点,月薪翻倍不是难题

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

NX二次开发UF_MTX2_copy 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_MTX2_copy Defined in: uf_mtx.h void UF_MTX2_copy(const double mtx_src [ 4 ] , double mtx_dst [ 4 ] ) overview 概述 Copies the 2x2 matrix elements from the source m…

快速排序算法的代码及算法思想

快速排序&#xff08;Quick Sort&#xff09;是一种常用的排序算法&#xff0c;他的时间复杂度为O(nlogn) 算法思想: 通过一趟排序将待排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据都比另一部分的所有数据小&#xff0c;然后再对这两部分数据分别进行快速排…

模糊C均值聚类(Fuzzy C-means clustering,FCM)的基本概念,详细流程以及广泛应用!

文章目录 1.基本概念2. FCM的详细流程3.FCM的应用 1.基本概念 模糊C均值聚类&#xff08;Fuzzy C-means clustering&#xff0c;FCM&#xff09;是一种软聚类方法&#xff0c;它允许数据点属于多个聚类中心&#xff0c;每个聚类中心都有一个权重。与传统的硬聚类方法&#xff…