c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现)

前段时间也是把指针较为详细系统的讲解完毕,接下来介绍一个全新的知识点,就是字符函数和字符串函数

前几期文章可进我主页观看:总之就是非常唔姆_Matlab,经验分享,c语言题目分享-CSDN博客

想要源代码可以去我的github看看:Nerosts/just-a-try: 学习c语言的过程、真 (github.com) 


目录

 一.求字符串长度

1.strlen() 

1.1示例 

1.2注意事项 

1.3模拟实现:

 二.长度不受限制的字符串函数

1.strcpy()

1.1示例 

1.2注意事项 

1.3模拟实现

2.strcat()

2.1示例 

 2.2注意事项

 2.3模拟实现

3.strcmp()

3.1示例

 3.2注意事项

3.3模拟实现

 三.长度受限制的字符串函数介绍

1.strncpy()

 1.1示例

1.2注意事项

2.strncat()

 2.1示例

2.2注意事项

 3.strncmp()

3.1示例

 3.2注意事项


 一.求字符串长度

1.strlen() 

当我们需要确定一个字符串的长度时,可以使用字符串函数 strlen()

strlen() 函数的原型如下:

#include <string.h>

size_t strlen(const char *str);

这个函数接受一个指向字符串的指针作为参数,并返回一个 size_t 类型的值,表示字符串中字符的数量

strlen() 函数的工作原理很简单。它会从给定的字符串的第一个字符开始,逐个检查每个字符,直到遇到字符串的结尾标志 \0。在这个过程中,它会计算字符的数量,并最终返回该数量。

1.1示例 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{char arr[] = "hello";printf("%s的长度是%d", arr, strlen(arr));return 0;
}

结果便是: 

1.2注意事项 

但是我们知道最后是有\0的

 所以我们可以得知:strlen() 函数只计算字符串中字符的数量,并不包括结尾的空符 \0

1.3模拟实现:

三种方式:

        1.计数器的方式

        2.递归的方式

        3.指针-指针的方式

计数器的方式:

size_t my_strlen(char* pa)
{assert(pa);int count = 0;while (*pa){count++;pa++;}return count;
}int main()
{char arr[] = "hello";printf("%s的长度是%d", arr, my_strlen(arr));return 0;
}

 递归的方式:

size_t my_strlen(char* pa)
{if (*pa){return my_strlen(pa + 1) + 1;}else{return 0;}
}int main()
{char arr[] = "hello";printf("%s的长度是%d", arr, my_strlen(arr));return 0;
}

指针-指针的方式:

size_t my_strlen(char* pa)
{char* start = pa;while (*pa){pa++;}return pa - start;
}int main()
{char arr[] = "hello";printf("%s的长度是%d", arr, my_strlen(arr));return 0;
}


 二.长度不受限制的字符串函数

1.strcpy()

strcpy() 函数用于将源字符串复制到目标字符串中

strcpy() 函数的原型如下:

#include <string.h>

char *strcpy(char *dest, const char *src);

这个函数接受两个参数:dest 和 srcdest 是目标字符串,src 是源字符串。函数会将源字符串中的内容复制到目标字符串中,并返回指向目标字符串的指针。

strcpy() 函数的工作原理很简单。它会从源字符串的第一个字符开始,逐个复制每个字符,直到遇到字符串的结尾标志 \0。在这个过程中,它会将每个字符复制到目标字符串的相应位置。

1.1示例 

int main() 
{char src[] = "Hello, world!";char dest[20];strcpy(dest, src);printf("The copied string is: %s\n", dest);return 0;
}

结果如下: 

1.2注意事项 

 strcpy() 函数会复制整个源字符串,包括结尾的空字符 \0。所以,在使用 strcpy() 函数时,目标字符串的长度应该足够长,以便能够容纳源字符串的所有字符

\0也在里面

1.3模拟实现

char* my_strcpy(char* dest, char* src)
{while (*src){*dest = *src;dest++;src++;}*dest = *src;
}int main() 
{char src[] = "Hello, world!";char dest[20];my_strcpy(dest, src);printf("The copied string is: %s\n", dest);return 0;
}

结果如下: 

依然可以进一步优化:

char* my_strcpy(char* dest, char* src)
{char* ret = dest;while (*dest++ = *src++){;}return ret;
}int main() 
{char src[] = "Hello, world!";char dest[20];my_strcpy(dest, src);printf("The copied string is: %s\n", dest);return 0;
}

2.strcat()

strcat() 函数用于将源字符串追加到目标字符串的末尾

strcat() 函数的原型如下:

#include <string.h>

char *strcat(char *dest, const char *src);

这个函数接受两个参数:dest 和 srcdest 是目标字符串,src 是源字符串。函数会将源字符串中的内容追加到目标字符串的末尾,并返回指向目标字符串的指针。

strcat() 函数的工作原理很简单。它会从目标字符串的结尾开始,逐个复制源字符串的字符,直到遇到源字符串的结尾标志 \0。在这个过程中,它会将每个字符追加到目标字符串的末尾

2.1示例 

int main()
{char arr1[20] = "hello";char arr2[] = " world";printf("%s", strcat(arr1, arr2));return 0;
}

 

 2.2注意事项

目标字符串必须具有足够的空间来存储源字符串的内容,否则会导致缓冲区溢出错误,目标字符串的长度应该足够长,以便能够容纳添加后的所有字符

 2.3模拟实现

char* my_strcat(char* dest, char* src)
{char* ret = dest;while (*dest){dest++;}while (*src){*dest = *src;dest++;src++;}*dest = *src;return ret;
}int main()
{char arr1[20] = "hello";char arr2[] = " world";printf("%s", my_strcat(arr1, arr2));return 0;
}

3.strcmp()

strcmp() 函数用于比较两个字符串的大小关系

strcmp() 函数的原型如下:

#include <string.h>

int strcmp(const char *str1, const char *str2);

这个函数接受两个参数:str1 和 str2,它们分别是要比较的两个字符串。函数会比较这两个字符串的内容,并返回一个整数值来表示它们的大小关系。

strcmp() 函数的返回值有以下三种可能:

  • 如果 str1 等于 str2,则返回值为 0。
  • 如果 str1 小于 str2,则返回值为一个负整数(通常是 -1)。
  • 如果 str1 大于 str2,则返回值为一个正整数(通常是 1)。

strcmp() 函数的比较是按照字典顺序进行的,即按照字符的 ASCII 值进行比较。它会逐个比较两个字符串中相应位置的字符,直到遇到不相等的字符或者遇到字符串的结尾标志 \0。在比较过程中,如果发现两个字符不相等,就会根据它们的 ASCII 值来确定它们的大小关系。

3.1示例

int main()
{char arr1[] = "abc";char arr2[] = "aec";int result = strcmp(arr1, arr2);if (result < 0) {printf("arr1 is less than arr2\n");}else if (result > 0) {printf("arr1 is bigger than arr2\n");}else {printf("arr1 is equal to arr2\n");}return 0;
}

结果如下:

 3.2注意事项

strcmp() 函数比较的是字符串的内容,而不是字符串的长度。所以,在使用 strcmp() 函数时,需要确保两个字符串的内存地址是有效的,并且包含了正确的字符串内容

3.3模拟实现

int my_strcmp(char* arr1, char* arr2)
{while (*arr1 == *arr2){if (*arr1 == '\0' && *arr2 == '\0'){return 0;}arr1++;arr2++;}return *arr1 - *arr2;
}int main()
{char arr1[] = "abc";char arr2[] = "aec";int result = my_strcmp(arr1, arr2);if (result < 0) {printf("arr1 is less than arr2\n");}else if (result > 0) {printf("arr1 is bigger than arr2\n");}else {printf("arr1 is equal to arr2\n");}return 0;
}

结果如下:


 三.长度受限制的字符串函数介绍

1.strncpy()

strncpy() 函数是C语言中的一个字符串函数,用于将一个字符串的一部分复制到另一个字符串中

strncpy() 函数的原型如下:

#include <string.h>char *strncpy(char *dest, const char *src, size_t n);

这个函数接受三个参数:destsrc 和 ndest 是目标字符串,src 是源字符串,n 是要复制的字符数。

strncpy() 函数会将源字符串中的前 n 个字符复制到目标字符串中,不包括结尾的空字符 \0。如果源字符串的长度小于 n,则会将剩余的字符用空字符 \0 填充。

 1.1示例

int main() 
{char src[] = "Hello, World!";char dest[20];strncpy(dest, src, 5);dest[5] = '\0';printf("Copied string: %s\n", dest);return 0;
}

结果如下: 

1.2注意事项

需要注意的是,strncpy() 函数不会自动在目标字符串的末尾添加空字符 \0

所以,在使用 strncpy() 函数复制字符串后,需要手动在目标字符串的末尾添加空字符 

2.strncat()

strncat() 函数是C语言中的一个字符串函数,用于将一个字符串的一部分连接到另一个字符串的末尾

strncat() 函数的原型如下:

#include <string.h>

char *strncat(char *dest, const char *src, size_t n);

这个函数接受三个参数:destsrc 和 ndest 是目标字符串,src 是源字符串,n 是要连接的字符数。

strncat() 函数会将源字符串中的前 n 个字符连接到目标字符串的末尾,并返回指向目标字符串的指针。如果源字符串的长度小于 n,则会将整个源字符串连接到目标字符串的末尾

 2.1示例

#include<stdio.h>
#include<string.h>
int main() 
{char dest[20] = "Hello, ";char src[] = "World!";strncat(dest, src, 5);printf("Connected string: %s\n", dest);return 0;
}

结果如下:

2.2注意事项

strncat() 函数会根据目标字符串的长度和要连接的字符数来确定是否有足够的空间来存储连接后的字符串。在使用 strncat() 函数连接字符串时,需要确保目标字符串具有足够的空间来存储连接后的结果 

 3.strncmp()

strncmp() 函数是C语言中的一个字符串函数,用于比较两个字符串的前 n 个字符是否相等

strncmp() 函数的原型如下:

#include <string.h>

int strncmp(const char *str1, const char *str2, size_t n);

这个函数接受三个参数:str1str2 和 nstr1 和 str2 是要比较的两个字符串,n 是要比较的字符数。

strncmp() 函数会比较 str1 和 str2 的前 n 个字符。如果这些字符完全相等,则返回值为0。如果两个字符串在前 n 个字符中有差异,则返回值为一个正整数或负整数,表示第一个不同字符的 ASCII 码差值

3.1示例

int main() {char str1[] = "Hello";char str2[] = "Hell";int result = strncmp(str1, str2, 4);if (result == 0) {printf("The first 4 characters of str1 and str2 are equal.\n");}else if (result < 0) {printf("The first different character in str1 is smaller than the corresponding character in str2.\n");}else {printf("The first different character in str1 is bigger than the corresponding character in str2.\n");}return 0;
}

 3.2注意事项

strncmp() 函数会在比较过程中遇到以下情况时停止比较:

  • 两个字符串的前 n 个字符完全相等
  • 已经比较了 n 个字符

如果两个字符串的长度不足 n,则会比较字符串的实际长度。因此,在使用 strncmp() 函数比较字符串时,需要确保字符串的长度足够,并且注意比较的字符数是否正确


今天的内容就梳理到这里了,接下来我会继续进行梳理的。感谢大家支持!!! 


 


 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

5. Mysql卸载

Mysql卸载 已经成功安装mysql&#xff0c;没有必要卸载&#xff0c;卸载之后不一定再次会安装成功。 双击安装包 检查如下三个目录是否有mysql&#xff0c;有的话&#xff0c;删除掉即可&#xff08;前提&#xff0c;电脑只有Mysql8,否则mysql其他版本也会被删除&#xff09;…

【数据结构】排序算法(二)—>冒泡排序、快速排序、归并排序、计数排序

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.冒泡排序 2.快速排序 2.1Hoare版 2.2占…

vue3 中使用echarts图表——柱状图

柱状图是比较常用的图形结构&#xff0c;所以我先收集一些精美的柱状图 一、柱状图&#xff1a;设置圆角和颜色 <template><div class"box" ref"chartDom"></div> </template> <script setup> import { ref, onMounted } fr…

无法启动此程序,因为计算机中“找不到msvcp140.dll”的解决方法

msvcp140.dll是Microsoft Visual C 2015 Redistributable的一个动态链接库文件&#xff0c;它是许多基于Visual Studio开发的应用程序和游戏的必要组件。当计算机上缺失msvcp140.dll文件时&#xff0c;可能会导致以下问题&#xff1a; 1. 程序无法启动&#xff0c;提示“找不到…

位图/布隆过滤器

一、位图 1.1位图的概念 所谓位图&#xff0c;就是用每一位来存放某种状态&#xff0c;适用于海量数据&#xff0c;数据无重复的场景。通常是用来判断某个数据存不存在的。 1.2位图的实现 template<size_t N>class bitset{public:bitset(){//需要N个比特位&#xff0c;…

生产设备巡检管理系统

凡尔码搭建生产设备巡检系统是通过确保巡检工作的质量以及提高巡检工作的效率来提高设备维护水平的一种系统&#xff0c;它对巡检管理考核工作从巡检人员、巡检任务、隐患管理、图像视频、盯防考核进行严格、科学的统计、分析&#xff0c;从而有效的保障巡检工作的顺利展开&…

Opengl之立方体贴图

简单来说,立方体贴图就是一个包含了6个2D纹理的纹理,每个2D纹理都组成了立方体的一个面:一个有纹理的立方体。你可能会奇怪,这样一个立方体有什么用途呢?为什么要把6张纹理合并到一张纹理中,而不是直接使用6个单独的纹理呢?立方体贴图有一个非常有用的特性,它可以通过一…

约束优化算法(optimtool.constrain)

import optimtool as oo from optimtool.base import np, sp, pltpip install optimtool>2.4.2约束优化算法&#xff08;optimtool.constrain&#xff09; import optimtool.constrain as oc oc.[方法名].[函数名]([目标函数], [参数表], [等式约束表], [不等式约数表], [初…

VulnHub Earth

一、信息收集 1.主机和端口扫描 nmap -sS 192.168.103.1/24 发现443端口有DNS解析&#xff0c;在hosts文件中添加DNS解析&#xff1a; 2.收集earth.local信息 发现有Previous Messages 37090b59030f11060b0a1b4e0000000000004312170a1b0b0e4107174f1a0b044e0a000202134e0a161…

Electron笔记

基础环境搭建 官网:https://www.electronjs.org/zh/ 这一套笔记根据这套视频而写的 创建项目 方式一: 官网点击GitHub往下拉找到快速入门就能看到下面这几个命令了 git clone https://github.com/electron/electron-quick-start //克隆项目 cd electron-quick-start //…

前端position: absolute是相对于谁定位的?

1. 当祖父元素是relative定位, 父元素是absolute定位, 子元素也是absolute定位 <script setup></script><template><div class"relative"><p class"absolute1">absolute1<p class"absolute2">absolute2<…

计算机竞赛 题目:基于python的验证码识别 - 机器视觉 验证码识别

文章目录 0 前言1 项目简介2 验证码识别步骤2.1 灰度处理&二值化2.2 去除边框2.3 图像降噪2.4 字符切割2.5 识别 3 基于tensorflow的验证码识别3.1 数据集3.2 基于tf的神经网络训练代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于pyt…

使用ebpf 监控linux内核中的nat转换

1.简介 Linux NAT&#xff08;Network Address Translation&#xff09;转换是一种网络技术&#xff0c;用于将一个或多个私有网络内的IP地址转换为一个公共的IP地址&#xff0c;以便与互联网通信。 在k8s业务场景中&#xff0c;业务组件之间的关系十分复杂. 由于 Kubernete…

gin 框架的 JSON Render

gin 框架的 JSON Render gin 框架默认提供了很多的渲染器&#xff0c;开箱即用&#xff0c;非常方便&#xff0c;特别是开发 Restful 接口。不过它提供了好多种不同的 JSON Render&#xff0c;那么它们的区别是什么呢&#xff1f; // JSON contains the given interface obje…

了解基于Elasticsearch 的站内搜索,及其替代方案

对于一家公司而言&#xff0c;数据量越来越多&#xff0c;如果快速去查找这些信息是一个很难的问题&#xff0c;在计算机领域有一个专门的领域IR&#xff08;Information Retrival&#xff09;研究如何获取信息&#xff0c;做信息检索。在国内的如百度这样的搜索引擎也属于这个…

oracle OCP OCM MySQL OCP认证难吗?

好多人在初次考OCP时&#xff0c;不知道如何选择&#xff0c;本文让姚远ACE老师为大家总结一下吧&#xff01; 选择OCP认证时要注意的问题&#xff1a; 1&#xff0c;授课老师师资经验&#xff08;非常重要&#xff09; 2&#xff0c;课程大纲 3&#xff0c;试听课程 4&am…

PHP 行事准则:allow_url_fopen 与 allow_url_include

文章目录 参考环境allow_url_fopenallow_url_fopen 配置项操作远程文件file 协议 allow_url_includeallow_url_include 配置项 allow_url_include 与 allow_url_fopen区别联系默认配置配置项关闭所导致异常运行时配置ini_set()限制 参考 项目描述搜索引擎Bing、GoogleAI 大模型…

安全性算法

目录 一、安全性算法 二、基础术语 三、对称加密与非对称加密 四、数字签名 五、 哈希算法 六、哈希算法碰撞与溢出处理 一、安全性算法 安全性算法的必要性&#xff1a; 安全性算法的必要性是因为在现代数字化社会中&#xff0c;我们经常需要传输、存储和处理敏感的数据…

运营人必备这个微信运营工具

微信管理系统CRM在各行各业都有应用的场景---IT互联网、制造业、商业服务、金融投资、教育培训、房产家装、电商、政务等20行业领域均得到广泛应用。 微信CRM管理系统的主要功能&#xff1a; 多个微信号聚合聊天&#xff1a;解决多个微信来回切换&#xff0c;换着手着手机的麻烦…

【C++】位图

位图 1. 位图1.1 位图的概念1.1 位图的实现1.3 位图的应用 2. 布隆过滤器2.1 概念2.2 模拟实现2.3 优点和缺点2.4 应用场景2.5 哈希切分的应用 1. 位图 1.1 位图的概念 位图&#xff0c;就是用二进制位来表示数据的某种状态&#xff0c;例如判断数据是否存在&#xff0c;二进…