【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 theterminating 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. 第一个字符串等于第二个字符串,则返回 03. 第一个字符串小于第二个字符串,则返回小于 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语言】字符串+内存函数的介绍
🎈个人主页:.满船清梦压星河_-CSDN博客 🌂c/c领域新星创作者 🎉欢迎👍点赞✍评论❤️收藏 😛😛😛希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教…...
C#WPF资源字典应用实例
本文实例演示C#WPF资源字典应用 目录 一、资源字典 二、实例 1新建一个资源字典 2添加到资源文件App.xaml...
如何在国际腾讯云服务器上设置IP节点的密码?
跟着云计算技术的发展,越来越多的企业和个人开始运用云服务器来存储和处理数据。腾讯云服务器是一款非常受欢迎的云服务器产品,它提供了高效稳定的计算能力。在运用腾讯云服务器的过程中,咱们可能需求设置IP节点的暗码,以便维护咱…...
浅谈基于敏捷开发交付应对突发项目
软件项目开发的全过程是一个很大的范畴,从确定需求,到编码设计,到集成发布,到运维、运营、设计方方面面。在这个过程中,交付过程是非常关键的,因为它影响着软件的质量、稳定性和用户体验。 在当今竞争激烈的…...
1.工具-VSCode有哪些常用快捷键
题记 记录一些vscode的常用快捷键 基本编辑 Ctrl C:复制选定内容。Ctrl X:剪切选定内容。Ctrl V:粘贴剪贴板内容。Ctrl Z:撤销上一步操作。Ctrl Shift Z:恢复上一步操作。Ctrl D:选择下一个匹配项…...
行业模型应该如何去拆解?
行业模型应该如何去拆解? 拆解行业模型是一个复杂的过程,涉及对整个行业的深入分析和理解。下面是一些步骤和方法,可以帮助你系统地拆解行业模型: 1. 确定行业范围 定义行业:明确你要分析的行业是什么,包括…...
【开题报告】基于微信小程序的签到打卡系统的设计与实现
1.研究背景与意义 考勤管理是企业日常管理的重要内容之一。随着企业规模的扩大和员工数量的增加,传统的考勤管理方式已经不能满足需求。而基于微信小程序的签到打卡系统可以提供方便快捷的签到打卡服务,为企业管理人员提高工作效率和员工考勤管理提供了…...
1.写一个算法模型以及python算法工程化步骤
生成一个 PT(Perceptual Tokenizer)模型的步骤如下: 准备数据集:首先,你需要准备一个用于训练 PT 模型的数据集。这可以是一个包含大量文本数据的语料库。 数据预处理:对数据进行预处理以准备训练。这可能…...
物联网AI MicroPython传感器学习 之 GC7219点阵屏驱动模块
学物联网,来万物简单IoT物联网!! 一、产品简介 LED-8 * 32点阵屏显示板由 4 块单色 8x8 共阴红色点阵单元组成,通过 SPI 菊花链模式将多块显示屏连接后可以组成更大的分辨率显示屏幕,任意组合分辨率。可用于简单仪表显…...
MySQL中查询重复字段的方法和步骤是怎样
示例 accountinfo 表数据如下: 场景一 单个字段重复数据查找 & 去重 我们要把上面这个表中 单个字段 account字段相同的数据找出来。 思路 分三步 简述: 第一步 要找出重复数据,我们首先想到的就是,既然是重复,…...
怎样才能去除视频中的背景音乐,保留人声?
做视频剪辑,二次创作的朋友,需要去除视频中的背景音乐,保留人声;或者去除人声,保留背景音乐。如果请身边做视频的朋友帮忙,可有时不能沟通到位,完成后的效果并不是很理想,就很尴尬了…...
【C语言程序设计】--C语言(一)计算机思维导论
控制台输出中文乱码问题解决: ref:https://blog.csdn.net/ymzhu385/article/details/121797080 基本数据类型 我们的程序离不开数据,比如我们需要保存一个数字或是字母,这时候这些东西就是作为数据进行保存,不过不同的数据他们的…...
三、git信息泄露
一、git信息泄露 解释:Git信息泄露是指通过公开或错误地配置版本控制系统Git,导致敏感数据(例如API密钥、数据库密码、个人信息等)被泄露到公共代码仓库或其他未授权的访问者手中。通俗来说,在公网暴露类似http://127…...
第 368 场 LeetCode 周赛题解
A 元素和最小的山形三元组 I 前后缀操作:求出前后缀上的最小值数组,然后枚举 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中,QFile、QByteArray、QDataStream和QTextStream是常用的文件和数据处理类。 主要功能和区别 QFile: QFile是用于读写文本和二进制文件以及资源的I/O设备。可以单独使用QFile,或者更方便地与QTextStream或QDataStream一起使用。 通常在…...
【操作系统】32进制小数转16进制
要将32进制的小数转换为16进制,可以按照以下步骤进行: 将32进制小数转换为10进制。可以使用上述提到的方法,将32进制小数转换为对应的10进制数。 将10进制数转换为16进制。使用常规的方法将10进制数转换为16进制数。可以将10进制数不断除以1…...
C#实现数据导出任一Word图表的通用呈现方法及一些体会
疲惫的修改 应人才测评产品的需求,导出测评报告是其中一个重要的环节,报告的文件类型也多种多样,其中WORD输出也扮演了一个重要的角色。 实现方法比较简单,结合分析结果数据,通过WORD模板文件进行替换输出。在实现的…...
2023-10 字节跳动面试整个过程 golang营销服务开发岗位
面试整个过程大约1个小时回答的中规中矩吧 很多问题回答的不具体 难受死我了非常简单的算法题下面列出来了面试步骤这里面有一点就是面试官本来想问问我数据结构这一块的问题 但是我说不太熟悉 他就没问了 1. 简单介绍个人信息 略2. 介绍简历上的项目 略3. 什么是分布式事务 主…...
Java类名的命名规范
Java中的类名必须以字母或者下划线开头,不能以数字开头。 类名的每个单词的首字母必须大写,这被称为帕斯卡命名法。 此外,类名不能使用关键字或保留字,不能使用数字除了_和$之外的任何符号,中间不能添加空格。 如果…...
【c++Leetcode】141. Linked List Cycle
问题入口 思想:Floyds Tortoise and Hare 这个算法简单来说就是设置一个慢指针(一次移动一个位置)和一个快指针(一次移动两个位置)。在遍历过程中,如果慢指针和快指针都指向同一个元素,证明环…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...
