详解字符串函数<string.h>(上)

1. strlen函数的使用和模拟实现

size_t strlen(const char* str);

1.1 函数功能以及用法

字符串长度

strlen函数的功能是计算字符串的长度。在使用时,要求用户传入需要计算长度的字符串的起始位置,并返回字符串的长度。

#include <stdio.h>
#include <string.h>int main()
{char arr[] = "abcdef";int len = strlen(arr);printf("%d\n", len);return 0;
}

1.2 函数的原理

该函数在得到字符串的起始位置之后,会从该起始位置开始依次向后检索并计数,直到遇到'\0'为止。

1.3 注意事项

1. 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包 含 '\0' )。

2. 参数指向的字符串必须要以 '\0' 结束。

3. 注意函数的返回值为size_t,是无符号的( 易错 )

针对第三点,我们给出以下示例

#include <stdio.h>
#include <string.h>
int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";if(strlen(str2)-strlen(str1)>0)//出错{printf("str2>str1\n");} else{printf("srt1>str2\n");}return 0;
}

由于strlen函数返回值的类型为“size_t”(unsigned int),所以两个strlen函数返回值相减,得到的结果的类型也是“size_t”,而该类型的数据一定会是大于等于零的,这与我们的代码所表达的意思不一致。

1.4 模拟实现

strlen的实现较为简单,所以这里给出三种实现方式:

1.4.1 计数器

在函数内部创建一个计数器,用以记录字符的个数

size_t my_strlen1(const char* str)
{assert(str);size_t count = 0;//计数器while(*str != '\0'){count++;str++;}return count;
}

1.4.2  指针-指针

size_t my_strlen2(const char* str)
{assert(str);const char* strx = str;while(*strx != '\0'){strx++;}return strx - str;//指针-指针
}

1.4.3 递归

size_t my_strlen3(const char* str)
{assert(str);if(*str == '\0')return 0;elsereturn 1 + my_strlen3(str+1);
}

2. strcpy函数的使用和模拟实现

char* strcpy(char * destination, const char* source);

2.1 函数功能以及用法

字符串拷贝

该函数会把“source”指向的字符串拷贝到“destination”指向的字符数组数组中,包括'\0'。在使用时,要求用户分别传入目标数组的起始地址和源字符串的起始地址,并返回目标数组的起始地址

#include <stdio.h>
#include <string.h>int main()
{char name[20] = {0};strcpy(name, "zhangsan");printf("%s\n", name);return 0;
}

2.2 函数的原理

“destination”和“source”依次逐字节移动,每次移动前将“source”指向的字符拷贝到“destination”指向的空间,直到将'\0'拷贝到目标数组中为止。

2.3 注意事项

1. 源字符串必须以 '\0' 结束。

2. 会将源字符串中的 '\0' 拷⻉到⽬标空间。

3. ⽬标空间必须⾜够⼤,以确保能存放源字符串。

4. ⽬标空间必须可修改。比如目标空间是处存放的是一个常字符串或者被const修饰的字符数组。

#include <stdio.h>
#include <string.h>int main()
{const char* p = "abcdef";char arr[] = "bit";strcpy(p, arr);return 0;
}

2.4 模拟实现

char* my_strcpy(char* dest, const char* src)
{assert(dest && src);char* ret = dest;while(*dest++ = *src++);return ret;
}

3. strcat函数的使用和模拟实现

char* strcat(char* destination, const char* source);

3.1 函数功能以及用法

字符串追加

该函数会将“source”指向的字符串追加到“destination”指向的字符数组的后面,原本的'\0'会被覆盖,源字符串的'\0'会被一起追加到字符数组之后(某些实现中可能是额外添加的'\0')。在使用时,要求用户分别传入目标数组的起始地址和源字符串的起始地址,并返回目标数组的起始地址。

#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "hello ";strcat(arr1, "world!");printf("%s\n", arr1);return 0;
}

3.2 函数的原理

首先找到目标数组结尾处的'\0',将其当作目标空间的起始地址的话,接下来的步骤就与strcpy相同了。

3.3 注意事项

1. 源字符串必须以 '\0' 结束。

2. ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。

3. ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。

4. ⽬标空间必须可修改。

5. 字符串自己给自己追加可能会出错。

#include <stdio.h>
#include <string.h>int main()
{char arr[20] = "hello";strcat(arr, arr);printf("%s\n", arr);return 0;
}

在第一个字符拷贝结束时,arr结尾的'\0'就被覆盖了,这时,strcat函数就不知道追加应该何时停止。 

3.4 模拟实现

char* my_strcat(char* dest, const char* src)
{assert(dest && src);char* ret = dest;while(*dest){dest++;}while(*dest++ = *src++);return ret;
}

4. strcmp函数的使用和模拟实现

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

4.1 函数功能以及用法

字符串比较

C语言标准规定:

第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字 。

第⼀个字符串等于第⼆个字符串,则返回0 。

第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字。

#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "zhangsan";char arr2[] = "zhangsanfeng";int ret = my_strcmp(arr1, arr2);if(ret < 0)printf("<\n");else if(ret == 0)printf("=\n");elseprintf(">\n");return 0;
}

4.2 函数的原理

按下标依次比较两个字符串元素的ascll码值。

4.3 注意事项

好像没什么好注意的。

4.4 模拟实现

int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while(*str1 == *str2){if(*str1 == '\0')return 0;str1++;str2++;}return (*str1 - *str2);
}

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

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

相关文章

基于SSM医院电子病历管理系统的设计与实现(源代码+数据库脚本+万字文档+PPT)

系统介绍 医院电子病历管理系统主要是借助计算机&#xff0c;通过对医院电子病历管理系统所需的信息管理&#xff0c;增加用户的选择&#xff0c;同时也方便对广大用户信息的及时查询、修改以及对用户信息的及时了解。医院电子病历管理系统 对用户带来了更多的便利&#xff0c…

Python GUI自动化定位代码参考

一、pyautogui原始逻辑 import pyautogui # 获取指定图片在屏幕上的位置 image_path path/to/image.png target_position pyautogui.locateCenterOnScreen(image_path) if target_position is not None: # 获取偏移量 offset_x 10 offset_y 10 # 计算实际点…

一文读懂ZKFair PFP-CyberArmy的参与价值与潜力

3月2日&#xff0c;ZKFair PFP-CyberArmy 将在 Element 上正式开始Public Sale。

文件基础和文件fd

文章目录 预备知识C语言的文件接口系统调用文件fd 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站。 预备知识 我们平时说文件就是说文件里…

1_Springboot(一)入门

Springboot&#xff08;一&#xff09;——入门 本章重点&#xff1a; 1.什么是Springboot; 2.使用Springboot搭建web项目&#xff1b; 一、Springboot 1.Springboot产生的背景 Servlet->Struts2->Spring->SpringMVC&#xff0c;技术发展过程中&#xff0c;对使…

大模型量化技术原理-SmoothQuant

近年来&#xff0c;随着Transformer、MOE架构的提出&#xff0c;使得深度学习模型轻松突破上万亿规模参数&#xff0c;从而导致模型变得越来越大&#xff0c;因此&#xff0c;我们需要一些大模型压缩技术来降低模型部署的成本&#xff0c;并提升模型的推理性能。 模型压缩主要分…

强化学习(六)时序差分

时序差分&#xff08;TD&#xff09;是强化学习的核心&#xff0c;其是蒙特卡罗&#xff08;MC&#xff09;和动态规划&#xff08;DP&#xff09;的结合。 1、TD 预测 TD 和 MC 都是利用经验来解决预测问题。一种非平稳环境的一般访问蒙特卡罗方法是 V ( S t ) ← V ( S t …

Python GUI开发库之nicegui使用详解

概要 在 Python 中,创建图形用户界面(GUI)应用程序通常需要大量的代码和时间。然而,随着 Python 生态系统的不断发展,出现了一些简化 GUI 开发过程的工具和库。其中之一就是 NiceGUI 库。本文将深入探讨 NiceGUI 库的功能、用法以及如何利用它来创建漂亮而功能丰富的 GUI…

如何使用css实现一个加载动画

如何使用css实现一个加载动画 有四个点 初始化为同一个颜色 每个阶段 不同的透明度 刷新也不会影响初始化 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthd…

List 集合遍历过程中删除元素避坑指南。

文章目录 1. 遍历2. 遍历过程中删除元素2.1 for 简单循环正向遍历方式2.2 for 简单循环反向遍历方式2.3 foreach 方式遍历删除2.4 Iterator的remove()方法2.5 <font color green> removeIf() &#xff08;推荐&#xff09;<green>2.6 Strem 方式 作为一名后端开发…

python之计算CPI

CPI&#xff0c;即消费者物价指数&#xff08;Consumer Price Index&#xff09;&#xff0c;是一个反映居民家庭一般所购买的消费品和服务项目价格水平变动情况的宏观经济指标。它是在特定时段内度量一组代表性消费商品及服务项目的价格水平随时间而变动的相对数&#xff0c;通…

网络测试相关

前言 网络测试通常是指在网络环境比较复杂&#xff0c;而且有较多限制时&#xff0c;就需要清楚网络的走向和途径的节点&#xff0c;便于在出现问题时进行排查和优化网络性能&#xff0c;相关知识大多是计算机网络的 测试工具 抓包 wireshark 路由探测 traceroute/tracert 这…

云快充充电桩系统设计书

充电桩系统设计书 一、系统设计概述 随着新能源汽车市场的快速发展&#xff0c;充电桩作为电动汽车的重要配套设施&#xff0c;其市场需求日益增长。本系统旨在提供一套稳定、高效、易用的充电桩解决方案&#xff0c;以满足市场上新能源充电桩的主流需求。通过实现云快充V1.6协…

nginx使用详解--动静分离

什么是动静分离&#xff1f; 为了提高网站的响应速度&#xff0c;减轻程序服务器&#xff08;Tomcat&#xff0c;Jboss等&#xff09;的负载&#xff0c;对于静态资源&#xff0c;如图片、js、css等文件&#xff0c;可以在反向代理服务器中进行缓存&#xff0c;这样浏览器在请…

如何选择激活函数?

选择神经网络的激活函数是一个重要的决策&#xff0c;因为激活函数的选择会影响到网络的收敛速度以及能否有效地训练。不同的激活函数适用于不同的任务和网络架构。以下是选择激活函数时可以考虑的一些指导原则和常用的激活函数&#xff1a; 指导原则 问题类型&#xff1a; 二…

LLM小记

RAG 参考 检索增强生成(RAG)概念及优化 主流模型 llama系列 1. 背景&#xff1a;模型参数量级的积累&#xff0c;或者训练数据的增加&#xff0c;哪个对性能提升帮助更大&#xff1f; 最近的 “Training Compute-Optimal Large Language Models” 这篇论文提出一种缩放定…

Java:PDF图片抽取的两种方法

图片和PDF是我们日常生活和工作中经常接触到的文档格式。PDF是人们日常使用最多的跨平台文档&#xff0c;是一种用独立于应用程序、硬件、操作系统的方式呈现文档的文件格式。每个PDF文件包含固定布局的平面文档的完整描述&#xff0c;包括文本、字形、图形及其他需要显示的信息…

如何利用HubSpot海外获客系统实现海外市场扩张?

在当今全球化的时代&#xff0c;企业面临着越来越激烈的竞争&#xff0c;而海外市场则被视为获取更多增长机会的重要途径之一。针对这一挑战&#xff0c;企业需要建立一个完整的海外获客系统&#xff0c;而HubSpot软件的应用则成为了关键。作为HubSpot的合作伙伴&#xff0c;我…

librtmp源码分析

阅读了librtmp的源码&#xff0c;简单记录下。 首先补充下AMF格式基本知识 1 AMF格式 AMF是Action Message Format(动作消息格式)的简写&#xff0c;它是一种二进制的数据格式。它的设计是为了把actionscript里面的数据(包括Object, Array, Boolean, Number等)序列化成二进制…

jvm 基础知识和jvm 调优

类装载分为以下 5 个步骤&#xff1a; 加载&#xff1a;根据查找路径找到相应的 class 文件然后导入&#xff1b; 检查&#xff1a;检查加载的 class 文件的正确性&#xff1b; 准备&#xff1a;给类中的静态变量分配内存空间&#xff1b; 解析&#xff1a;虚拟机将常量池中的符…