当前位置: 首页 > news >正文

【C语言】字符串+内存函数的介绍

🎈个人主页:.满船清梦压星河_-CSDN博客

🌂c/c++领域新星创作者

🎉欢迎👍点赞✍评论❤️收藏

😛😛😛希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流!


0.前言

C 语言中对字符和字符串的处理很是频繁,但是 C 语言本身是没有字符串类型的,字符串通常放在 常量字符串中或者 字符数组 中。字符串常量适用于那些对它不做修改的字符串函数。

1.函数介绍

1.1 strlen
用来计算字符串长度
size_t  strlen ( const char * str );

1. 字符串已经 '\0' 作为结束标志, strlen 函数返回的是在字符串中 '\0' 前面出现的字符个数(不包 '\0' )
2. 参数指向的字符串必须要以 '\0' 结束。
3. 注意函数的返回值为 size_t ,是无符号的。
1.2 strcpy 

字符串拷贝函数

char* strcpy ( char * destination , const char * source );
1. Copies the C string pointed by source into the array pointed by destination, including the
terminating null character (and stopping at that point).
2. 源字符串必须以 '\0' 结束。
3. 会将源字符串中的 '\0' 拷贝到目标空间。
4. 目标空间必须足够大,以确保能存放源字符串。
5. 目标空间必须可变。
1.3 strcat 
在字符串末尾追加字符串
char * strcat ( char * destination , const char * source );
1. Appends a copy of the source string to the destination string. The terminating null      character  in destination is overwritten by the first character of source, and a null-character   is included at the end of the new string formed by the concatenation of both in destination.
2. 源字符串必须以 '\0' 结束。
3. 目标空间必须有足够的大,能容纳下源字符串的内容。
4. 目标空间必须可修改。
1.4 strcmp 
比较字符串大小
int strcmp ( const char * str1 , const char * str2 );
标准规定:
                1.   第一个字符串大于第二个字符串,则返回大于 0 的数字
                2.   第一个字符串等于第二个字符串,则返回 0
                3.   第一个字符串小于第二个字符串,则返回小于 0 的数字
1.5 strncpy 
char * strncpy ( char * destination , const char * source , size_t num );
拷贝 num 个字符从源字符串到目标空间。
如果源字符串的长度小于 num ,则拷贝完源字符串之后,在目标的后边追加 0 ,直到 num 个。
1.6 strncat 
char * strncat ( char * destination , const char * source , size_t num );
1. destination要有足够的空间来容纳要拷贝的字符串
 
2. strncat会将dest字符串最后的’\0’覆盖掉,字符追加完成后,再追加’\0’
 
3. 如果num大于字符串src的长度,那么仅将src全部追加到dest的尾部;
4. 如果num小于字符串src的长度,该字符会将src的所有字符附加在dest末尾。无论哪种情        况,都会在新字符串的末尾添加空字符。
1.7 strncmp
int strncmp ( const char * str1 , const char * str2 , size_t num );
比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。返回值与strcmp类似。
1.8 strstr
char * strstr ( const char * str1 , const char * str2 );
返回str2在str1中第一次出现的位置,如果str1中不存在str1,则返回一个空指针。
1.9 strtok
char * strtok ( char * str , const char * sep );-----字符串分割函数
1. sep 参数是个字符串,定义了用作分隔符的字符集合
2. 第一个参数指定一个字符串,它包含了 0 个或者多个由 sep 字符串中一个或者多个分隔符分      割的标记。
3.  strtok 函数找到 str 中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok 函数会改变被操作的字符串,所以在使用 strtok 函数切分的字符串一般都是临时            拷贝的内容 并且可修改。)
4. strtok 函数的第一个参数不为 NULL ,函数将找到 str 中第一个标记, strtok 函数将保存它在      字符串 中的位置。
5. strtok 函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下        一个标记。
6. 如果字符串中不存在更多的标记,则返回 NULL 指针。

给大家看一个示例代码: 

#include <stdio.h>
int main()
{char* p = "houjindong@bjut.edu.cn";const char* sep = ".@";char arr[50];char* str = NULL;strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep)){printf("%s\n", str);}
}

1.10 strerror
char * strerror ( int errnum );
返回错误码,所对应的错误信息。

示例代码: 

#define _CRT_SECURE_NO_WARNINGS 1
#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;
}

 

1.11 memcpy
void * memcpy ( void * destination , const void * source , size_t num );
1. 函数 memcpy source 的位置开始向后复制 num 个字节的数据到 destination 的内存位置。
 
2.  这个函数在遇到 '\0' 的时候并不会停下来。
3. 如果 source destination 有任何的重叠,复制的结果都是未定义的。
1.12 memmove
void * memmove ( void * destination , const void * source , size_t num );
1. 和 memcpy 的差别就是 memmove 函数处理的源内存块和目标内存块是可以重叠的。
2. 如果源空间和目标空间出现重叠,就得使用 memmove 函数处理。
1.13 memcmp  
int memcmp ( const void * ptr1 , const void * ptr2 , size_t num );
比较从 ptr1 ptr2 指针开始的 num 个字节。
返回值类型如下:

2.函数的模拟实现

2.1模拟实现strlen

求字符串的长度可以用三种方式来模拟实现:

①计数器方式

//计数器方式
int my_strlen(const char * str)
{int count = 0;while(*str){count++;str++;}return count;
}

②递归方式

int my_strlen(const char * str)
{if(*str == '\0')return 0;elsereturn 1+my_strlen(str+1);
}

③指针运算的方式

//指针-指针的方式
int my_strlen(char *s)
{char *p = s;while(*p != ‘\0’ )p++;return p-s;
}
2.2模拟实现strcpy
char *my_strcpy(char *dest, const char*src)
{ char *ret = dest;assert(dest != NULL);assert(src != NULL);while((*dest++ = *src++)){;}return ret;
}
2.3模拟实现strcat
char *my_strcat(char *dest, const char*src)
{char *ret = dest;assert(dest != NULL);assert(src != NULL);while(*dest){dest++;}while((*dest++ = *src++)){;}return ret;
}
2.4模拟实现strstr
const char* my_strstr(const char* str1, const char* str2)
{const char* s1;//遍历str1指向的字符串const char* s2; //遍历str2指向的字符串const char* cp;//保存开始比较的位置assert(str1 && str2);if (*str2=='\0'){return str1;}cp=str1;while (*cp){s1 = cp;s2 = str2;while (*s1 && *s2 && *s1 == *s2){s1++;s2++;}if (*s2 == '\0'){return cp;}cp++;}return NULL;
}
2.5模拟实现strcmp
int my_strcmp (const char * src, const char * dst)
{int ret = 0 ;assert(src != NULL);assert(dest != NULL);while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)++src, ++dst;if ( ret < 0 )ret = -1 ;else if ( ret > 0 )ret = 1 ;return( ret );
}
2.6模拟实现memcpy
void* my_memcpy(void* dest, void* src, size_t sz)
{assert(dest && src);while (sz--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}
}
2.7模拟实现memmove
void* my_memmove(void* dest, void* src, size_t sz)
{assert(dest && src);void* start = dest;if (dest < src)//ǰ󿽱{while (sz--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}}else//Ӻǰ{while (sz--){*((char*)dest + sz) = *((char*)src + sz);}}return start;
}

🛻🛻🛻 文章到此,我也就基本上给大家介绍完了。我们下篇文章再见!

                希望路过的各位点点关注点点赞👍

相关文章:

【C语言】字符串+内存函数的介绍

&#x1f388;个人主页&#xff1a;.满船清梦压星河_-CSDN博客 &#x1f302;c/c领域新星创作者 &#x1f389;欢迎&#x1f44d;点赞✍评论❤️收藏 &#x1f61b;&#x1f61b;&#x1f61b;希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xf…...

C#WPF资源字典应用实例

本文实例演示C#WPF资源字典应用 目录 一、资源字典 二、实例 1新建一个资源字典 2添加到资源文件App.xaml...

如何在国际腾讯云服务器上设置IP节点的密码?

跟着云计算技术的发展&#xff0c;越来越多的企业和个人开始运用云服务器来存储和处理数据。腾讯云服务器是一款非常受欢迎的云服务器产品&#xff0c;它提供了高效稳定的计算能力。在运用腾讯云服务器的过程中&#xff0c;咱们可能需求设置IP节点的暗码&#xff0c;以便维护咱…...

浅谈基于敏捷开发交付应对突发项目

软件项目开发的全过程是一个很大的范畴&#xff0c;从确定需求&#xff0c;到编码设计&#xff0c;到集成发布&#xff0c;到运维、运营、设计方方面面。在这个过程中&#xff0c;交付过程是非常关键的&#xff0c;因为它影响着软件的质量、稳定性和用户体验。 在当今竞争激烈的…...

1.工具-VSCode有哪些常用快捷键

题记 记录一些vscode的常用快捷键 基本编辑 Ctrl C&#xff1a;复制选定内容。Ctrl X&#xff1a;剪切选定内容。Ctrl V&#xff1a;粘贴剪贴板内容。Ctrl Z&#xff1a;撤销上一步操作。Ctrl Shift Z&#xff1a;恢复上一步操作。Ctrl D&#xff1a;选择下一个匹配项…...

行业模型应该如何去拆解?

行业模型应该如何去拆解&#xff1f; 拆解行业模型是一个复杂的过程&#xff0c;涉及对整个行业的深入分析和理解。下面是一些步骤和方法&#xff0c;可以帮助你系统地拆解行业模型&#xff1a; 1. 确定行业范围 定义行业&#xff1a;明确你要分析的行业是什么&#xff0c;包括…...

【开题报告】基于微信小程序的签到打卡系统的设计与实现

1.研究背景与意义 考勤管理是企业日常管理的重要内容之一。随着企业规模的扩大和员工数量的增加&#xff0c;传统的考勤管理方式已经不能满足需求。而基于微信小程序的签到打卡系统可以提供方便快捷的签到打卡服务&#xff0c;为企业管理人员提高工作效率和员工考勤管理提供了…...

1.写一个算法模型以及python算法工程化步骤

生成一个 PT&#xff08;Perceptual Tokenizer&#xff09;模型的步骤如下&#xff1a; 准备数据集&#xff1a;首先&#xff0c;你需要准备一个用于训练 PT 模型的数据集。这可以是一个包含大量文本数据的语料库。 数据预处理&#xff1a;对数据进行预处理以准备训练。这可能…...

物联网AI MicroPython传感器学习 之 GC7219点阵屏驱动模块

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 LED-8 * 32点阵屏显示板由 4 块单色 8x8 共阴红色点阵单元组成&#xff0c;通过 SPI 菊花链模式将多块显示屏连接后可以组成更大的分辨率显示屏幕&#xff0c;任意组合分辨率。可用于简单仪表显…...

MySQL中查询重复字段的方法和步骤是怎样

示例 accountinfo 表数据如下&#xff1a; 场景一 单个字段重复数据查找 & 去重 我们要把上面这个表中 单个字段 account字段相同的数据找出来。 思路 分三步 简述&#xff1a; 第一步 要找出重复数据&#xff0c;我们首先想到的就是&#xff0c;既然是重复&#xff0c…...

怎样才能去除视频中的背景音乐,保留人声?

做视频剪辑&#xff0c;二次创作的朋友&#xff0c;需要去除视频中的背景音乐&#xff0c;保留人声&#xff1b;或者去除人声&#xff0c;保留背景音乐。如果请身边做视频的朋友帮忙&#xff0c;可有时不能沟通到位&#xff0c;完成后的效果并不是很理想&#xff0c;就很尴尬了…...

【C语言程序设计】--C语言(一)计算机思维导论

控制台输出中文乱码问题解决&#xff1a; ref:https://blog.csdn.net/ymzhu385/article/details/121797080 基本数据类型 我们的程序离不开数据&#xff0c;比如我们需要保存一个数字或是字母&#xff0c;这时候这些东西就是作为数据进行保存&#xff0c;不过不同的数据他们的…...

三、git信息泄露

一、git信息泄露 解释&#xff1a;Git信息泄露是指通过公开或错误地配置版本控制系统Git&#xff0c;导致敏感数据&#xff08;例如API密钥、数据库密码、个人信息等&#xff09;被泄露到公共代码仓库或其他未授权的访问者手中。通俗来说&#xff0c;在公网暴露类似http://127…...

第 368 场 LeetCode 周赛题解

A 元素和最小的山形三元组 I 前后缀操作&#xff1a;求出前后缀上的最小值数组&#xff0c;然后枚举 j j j class Solution { public:int minimumSum(vector<int> &nums) {int n nums.size();vector<int> l(n), r(n);//l[i]min{nums[0],...,nums[i]}, r[i]mi…...

Qt中QFile、QByteArray QDataStream和QTextStream区别及示例

在Qt中&#xff0c;QFile、QByteArray、QDataStream和QTextStream是常用的文件和数据处理类。 主要功能和区别 QFile&#xff1a; QFile是用于读写文本和二进制文件以及资源的I/O设备。可以单独使用QFile&#xff0c;或者更方便地与QTextStream或QDataStream一起使用。 通常在…...

【操作系统】32进制小数转16进制

要将32进制的小数转换为16进制&#xff0c;可以按照以下步骤进行&#xff1a; 将32进制小数转换为10进制。可以使用上述提到的方法&#xff0c;将32进制小数转换为对应的10进制数。 将10进制数转换为16进制。使用常规的方法将10进制数转换为16进制数。可以将10进制数不断除以1…...

C#实现数据导出任一Word图表的通用呈现方法及一些体会

疲惫的修改 应人才测评产品的需求&#xff0c;导出测评报告是其中一个重要的环节&#xff0c;报告的文件类型也多种多样&#xff0c;其中WORD输出也扮演了一个重要的角色。 实现方法比较简单&#xff0c;结合分析结果数据&#xff0c;通过WORD模板文件进行替换输出。在实现的…...

2023-10 字节跳动面试整个过程 golang营销服务开发岗位

面试整个过程大约1个小时回答的中规中矩吧 很多问题回答的不具体 难受死我了非常简单的算法题下面列出来了面试步骤这里面有一点就是面试官本来想问问我数据结构这一块的问题 但是我说不太熟悉 他就没问了 1. 简单介绍个人信息 略2. 介绍简历上的项目 略3. 什么是分布式事务 主…...

Java类名的命名规范

Java中的类名必须以字母或者下划线开头&#xff0c;不能以数字开头。 类名的每个单词的首字母必须大写&#xff0c;这被称为帕斯卡命名法。 此外&#xff0c;类名不能使用关键字或保留字&#xff0c;不能使用数字除了_和$之外的任何符号&#xff0c;中间不能添加空格。 如果…...

【c++Leetcode】141. Linked List Cycle

问题入口 思想&#xff1a;Floyds Tortoise and Hare 这个算法简单来说就是设置一个慢指针&#xff08;一次移动一个位置&#xff09;和一个快指针&#xff08;一次移动两个位置&#xff09;。在遍历过程中&#xff0c;如果慢指针和快指针都指向同一个元素&#xff0c;证明环…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...