字符串函数和内存函数

字符串函数

1、strlcpy 【字符串拷贝】

(将原字符串中的字符拷贝到目标字符数组中,包括终止符号\0,并在这里停止;为了避免越界,目标字符串数组应该足够大去接收)👆

(返回值是 destination,是个地址,目标字符数组的首地址)

// strcpy  字符串拷贝
//模拟实现
char* my_strcpy(char* des, const char* sour)
{assert(sour&&des);char* ret = des;/*while (*sour){*des++ = *sour++;}*des = *sour;*/while (*des++ = *sour++);return ret;
}int main()
{char arr[20] = { 0 };char sour[] = "i lovw you";my_strcpy(arr, sour);zhangsan//strcpy(arr, "zhangsan");//printf("%s\n", arr);//strcpy(arr, "zhang\0san");printf("%s\n", arr);拷贝遇到\0停下return 0;
}

2、strcat 【字符串追加】

(在目标地址\0处开始,将source指的字符串加到后面,包括source指向字符串的\0也加上去)

返回值是destination指向字符数组的首元素地址

// strcat   字符串追加
//模拟实现
char* my_strcat(char* des, const char* sour)
{char* ret = des;int len = strlen(des);des = des + len;while (*des++ = *sour++);return ret;
}int main()
{char arr[20] = "hello";char brr[] = ",lpp!";printf("%s\n",arr);my_strcat(arr, brr);printf("%s\n", arr);return 0;
}

3、strcmp 【字符串比较】

如何比较呢? 是一一对应的比较

a b c e o     字符串n

a b c p w     字符串m

= = = ×            ——>   m>n

(从俩字符串的第一个字符开始比较,如果相同,继续比较,直到不相等或者\0)

返回值由比较结果决定,前者大于后者,返回>0 ;相等返回 0 ;前小于后,返回 <0

// strcmp 【比较字符串】
//模拟实现
int my_strcmp(const char* str1, const char* str2)
{while (*str1++ == *str2++ && *str1 != '\0');return *str1 - *str2;}int main()
{char arr[] = "abwdef";char brr[] = "abwdefp";int n=my_strcmp(arr, brr);printf("%d\n", n);
}

strcmp 、strcpy 、strcat  是长度不受限制的字符串函数↑,由一定风险,发生越界



strncmp、strncpy、strncat  是长度受限制的字符串函数 ↓  (多一个个数的限制)

4、strncpy  【字符串拷贝,限定版】

(跟strcpy用法基本一样,只不过多了一层限定,限定了拷贝字符的个数,

     假如限定拷贝5个,source指向的字符串不止5个,就只拷贝 5个

                                    source指向的字符串没有5个,依旧拷贝5个,没有的补 \0 )  

int main()
{char arr1[20] = "ancd yiw********* ";char arr2[] = "hello";strncpy(arr1, arr2, 10);printf("%s\n", arr1);return 0;
}

没有 拷贝之前 arr1 里面的字符如下:

拷贝之后 arr1 内字符如下 ↓   (可见,不足要求个数的时候补 \0)

5、strncat   【字符串追加  限定版】

同strcat用法差不多,也是多个限定追加字符的个数

但是当 追加个数(num) 大于sourse指向的字符串 里的字符个数时,不会强制全补 \0,

追加完sourse 指向字符串,就不再追加

int main()
{char arr1[20] = "hello \0********";char arr2[] = "baby";strncat(arr1, arr2, 7);printf("%s\n", arr1);// hello baby}

追加前 arr1 内情况👇

追加后,arr1 内情况  👇

6、strncmp   【字符串比较  限定版】

(比较停止条件 1、比出不同   2、比到 \0   3、比到超出要求数字(num))

int main()
{char arr1[] = "abcde";char arr2[] = "abcoi";int n=strncmp(arr1, arr2, 3);printf("%d ", n);// 0return 0;
}

如上: 当num为3 的时候 返回值是0,只比到了第三个字符

            当num大于3时,返回值<0,因为第4对的 o 大于 d


如上,是长度受限制的字符串函数 👆


7、strstr  【查找子串】

返回的是查找到的那个字符串的首地址,如果没有查找到,返回空指针。

int main()
{char arr[] = "hello my baby nice to meet you.";char* ptr;ptr=strstr(arr, "baby");if (ptr != NULL)strncpy(ptr, "lpp,", 4);printf("%s\n", arr);//hello my lpp, nice to meet you.return 0;
}

模拟strstr函数,实现它的功能:

const char* my_strstr(const char* str1, const char* str2)
{const char* s1 = str1;const char* s2 = str2;const char* p = str1;while (*s1){s1 = p;s2 = str2;while (*s1!='\0'&&*s2!='\0'&& * s1 == *s2){s1++;s2++;}if (*s2 == '\0')return (char*)p;p++;}return NULL;
}


8、strtok 【切割字符串】

>strtok函数找到str中的下一个标记,并将其用\0结尾,返回指向这个标记的指针。(注:
strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容
并且可修改。)
>strtok函数的第一个参数不为 NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串
中的位置。
>strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标
记。
>如果字符串中不存在更多的标记,则返回NULL指针。

(返回值:第一次传非空指针,发现字符串,返回发现字符首字母地址,

   然后strtok记忆这个字符地址,下次NLULL进来,继续从这个位置开始,

   读取完整个字符,返回NULL)

int main()
{char arr[] = "i.study.every.day_365*day.";char a[100] = { 0 };strcpy(a, arr);char* ret;for (ret = strtok(a, "._*"); ret != NULL;ret=strtok(NULL,"._*")){printf("%s ", ret);}return 0;
}

9、字符分类函数  <ctype.h>

字符分类函数
iscntrl任何控制字符
isspace空白字符:空格' ' ,   换页'\f',   换行'\n',   回车‘\r',   制表符'\t',   垂直符'\v'
isdigit

十进制数字0~9

islower小写字母
isupper大写字母
isalpha字母(包括大小写)
isalnum字母或数字
ispunct标点符号,任何不属于数字或字母的图形字符
isgraph任何图形字符
isprint任何可打印字符,包括图形字符和空白字符
isxdigit

十六进制数字,包括所有十进制数字,

小写字母a~f,大写字母A~F

函数  ↑↑↑如果·它的参数符合上面条件 就返回真

用法相似,举个列子,isupper 函数

因为字符在内存中都是以·ASCII值储存的

int main()
{char a = 'a';char b = 'A';printf("%d %d", isupper(a), isupper(b));// 0 1return 0;
}

假,返回 0,真,返回>0的值(1)

10、字符转换函数        tolower   toupper

tolower 将 大写字母 变成 小写字母

toupper将 小写字母 变成 大写字母

其他不符合条件的字符不会改变

int main()
{char a = 'A';char b;b = tolower(a);printf("%c\n", b);//ab = tolower(b);printf("%c\n", b);//ab = toupper(b);printf("%c\n", b);//Ab = toupper('@');printf("%c\n", b);//@return 0;
}

11、strerror   【将错误码转换成错误信息】

c语言的库函数,在执行失败的时候,都会设置错误码

(给它一个错误信息码,它会找到对应的错误字符串,并且将首地址返回给你)

errno  是c语言设置的一个全局的 错误码 存放的变量    头文件<errno.h>

int main()
{//printf("%s\n", strerror(0));//No error//printf("%s\n", strerror(1));//Operation not permitted//printf("%s\n", strerror(2));//No such file or directory//printf("%s\n", strerror(3));//No such process
//fopen 是打开文件的函数, 里面放的是文件路径,和打开方式 r是 读
//如果打开失败 返回值是NULLFILE* pf = fopen("C:\\Users\\嗷~里~个~嗷\\Desktop", "r");if (pf == NULL){printf("%s\n", strerror(errno));}else{;}//Permission deniedreturn 0;
}


内存函数

12、memcpy   【内存拷贝】

与strncpy不同的是,memcpy是适用于所有类型,第三个参数,是字节个数    

其 返回值是 destination 所指向的首地址

memcpuy  负责 拷贝两块独立空间的数据,

不适用于重叠内存之间的数据拷贝

// 模拟实现
void* my_memcpy(const void* dis, const void* sou, size_t num)
{
//因为要保证整个函数具体范性,所以一个字节一个字节进行
//char* ,一次访问一个字节char* ret =(char*) dis;while (num--){*(char*)dis = *(char*)sou;dis = (char*)dis + 1;sou = (char*)sou + 1;}return ret;
}int main()
{int i = 0;int arr1[] = { 1,2,3,4,5,6,7,8 };int arr2[4] = { 11,22,33,44 };my_memcpy(arr1, arr2, sizeof(arr2));for (i = 0; i < (sizeof(arr1) / sizeof(arr1[0]));i++)printf("%d ",arr1[i]);putchar('\n');double brr1[] = { 1.1,2.2,3.3,4.4 };double brr2[] = { 11.11,22.22,33.33,44.44 };my_memcpy(brr1, brr2, sizeof(brr2));for (i = 0; i < (sizeof(brr1) / sizeof(brr1[0])); i++)printf("%.2lf ", brr1[i]);return 0;}

13、memmove  【内存拷贝,加强版】

与memcpy相比,它可以实现,重叠内存数据的拷贝,其他用法一样。

void test_cpy()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };memcpy(arr + 2, arr, 20);int i = 0;for (i = 0; i < 10; i++)printf("%d ", arr[i]);putchar('\n');}void test_move()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };memmove(arr + 2, arr, 20);int i = 0;for (i = 0; i < 10; i++)printf("%d ", arr[i]);putchar('\n');
}int main()
{test_cpy();test_move();return 0;
}

模拟实现  👇

void* my_memmove(const void* des, const void* sour, size_t num)
{assert(des && sour);void* ret = des;if (des < sour){//从前往后拷贝while (num--){*(char*)des = *(char*)sour;des = (char*)des + 1;sour = (char*)sour + 1;}}else{// 从后往前拷贝while (num--){*((char*)des + num) = *((char*)sour + num);}}}

图解如下所示:

14、memcmp   【内存比较】

strncmp 函数相比,它是适用所有类型,其他基本一样

int main()
{int arr[] = { 1,2,3,4,5 };int brr[] = { 1,2,3,8,5 };int x = memcmp(arr, brr, 12);int y = memcmp(arr, brr, 16);printf("%d %d", x, y);// 0 -1 
}

15、memset  【内存设置】

ptr 是指向我们要改变的位置,

value 是我们要变成的对象,

num是要改变字节的个数

int main()
{char arr[] = "hello baby.";memset(arr, '*', 5);printf("%s\n", arr);//***** baby.int brr[5] = { 1,2,3,4,5 };int i = 0;memset(brr+1, 0, 8);for (i = 0; i < 5; i++)printf("%d ", brr[i]);// 1 0 0 4 5//一个字节一个字节来return 0;
}

👏👏👏👏👏👏👏👏👏👏👏

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

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

相关文章

Electron-vue 框架升级 Babel7 并支持electron-preload webapck 4 打包过程记录

前言 我这边一直用的electron-vue框架是基于electron 21版本的&#xff0c;electron 29版本追加了很多新功能&#xff0c;但是这些新功能对开发者不友好&#xff0c;对electron构建出来的软件&#xff0c;使用者更安全&#xff0c;所以&#xff0c;我暂时不想研究electron 29版…

ML 系列:第 39 节 - 估计方法:最大似然估计 (MLE)

目录 一、说明 二、什么是最大似然估计 (MLE)&#xff1f; 2.1 理解公式 2.2 MLE 的定义 2.3 我们何时使用 MLE&#xff1f; 三、结论 一、说明 在统计学领域&#xff0c;我们经常需要根据观察到的数据估计统计模型的参数。为此目的广泛使用的两种关键方法是最大似然估计 ( MLE…

文本生成类(机器翻译)系统评估

在机器翻译任务中常用评价指标&#xff1a;BLEU、ROGUE、METEOR、PPL。 这些指标的缺点&#xff1a;只能反应模型输出是否类似于测试文本。 BLUE&#xff08;Bilingual Evaluation Understudy&#xff09;&#xff1a;是用于评估模型生成的句子(candidate)和实际句子(referen…

vue.js学习(day 19)

自定义创建项目 ESlint 代码规范 代码规范错误 手动修正 自动修正 settings.json {"emmet.triggerExpansionOnTab": true,"editor.fontSize": 25,// 当保存的时候&#xff0c;eslint自动帮我们修复错误"editor.codeActionsOnSave": {&qu…

两个畸变矩阵相乘后还是一个2*2的矩阵,有四个畸变元素。1、畸变矩阵吸收了法拉第矩阵。2、畸变矩阵也给法拉第旋转角带来模糊(求解有多种可能)

角度一&#xff1b;恢复畸变的时候也把法拉第旋转恢复了 角度二&#xff1a;求解法拉第旋转角的时候 前面乘的复系数的不同也会带来法拉第旋转角和畸变的不同解 注意&#xff1a;无论多少个畸变矩阵相乘&#xff0c;结果都是2*2的矩阵&#xff0c;也就是畸变参数可以减少…

VR眼镜可视化编程:开启医疗信息系统新纪元

一、引言 随着科技的飞速发展&#xff0c;VR 可视化编程在医疗信息系统中的应用正逐渐成为医疗领域的新趋势。它不仅为医疗教育、手术培训、疼痛管理等方面带来了新的机遇&#xff0c;还在提升患者体验、推动医疗信息系统智能化等方面发挥着重要作用。 在当今医疗领域&#xf…

禾川Q1系列PLC控制X3E总线伺服

1、建立链接 2、配置EtherCAT总线 3、添加Cia402轴 4、添加总线设备 5、总线轴控FB建立 代码部分1

股市复盘笔记

复盘是股市投资中非常重要的一个环节&#xff0c;它指的是投资者在股市收盘后&#xff0c;对当天的市场走势、个股表现以及自己的交易行为进行回顾和总结&#xff0c;以便更好地指导未来的投资决策。以下是对复盘的详细解释&#xff1a; 一、复盘的目的 总结市场走势&#xff…

基于TensorFlow框架的线性回归实现

目录 ​编辑 线性回归简介 TensorFlow简介 线性回归模型的TensorFlow实现 1. 安装TensorFlow 2. 导入必要的库 3. 准备数据 4. 定义模型 5. 定义损失函数 6. 定义优化器 7. 训练模型 8. 评估模型 9. 模型参数的可视化 10. 模型预测的准确性评估 结论 在统计学和…

网页端五子棋对战(四)---玩家匹配实现上线下线处理

文章目录 1.游戏大厅用户匹配1.1请求和响应1.2设计匹配页面1.3获取玩家信息1.4玩家信息的样式设置1.5初始化我们的websocket1.6点击按钮和客户端交互1.7点击按钮和服务器端交互 2.服务器端实现匹配功能框架2.1方法重写2.2借用session 3.处理上线下线3.1什么是上线下线3.2实现用…

「Mac畅玩鸿蒙与硬件42」UI互动应用篇19 - 数字键盘应用

本篇将带你实现一个数字键盘应用&#xff0c;支持用户通过点击数字键输入数字并实时更新显示内容。我们将展示如何使用按钮组件和状态管理来实现一个简洁且实用的数字键盘。 关键词 UI互动应用数字键盘按钮组件状态管理用户交互 一、功能说明 数字键盘应用将实现以下功能&…

cgo内存泄漏排查

示例程序&#xff1a; package main/* #include <stdlib.h> #include <string.h> #include <stdio.h> char* cMalloc() {char *mem (char*)malloc(1024 * 1024 * 16);return mem; } void cMemset(char* mem) {memset(mem, -, 1024 * 1024 * 16); } int arr…

红日靶场vulnstack (五)

前言 好久没打靶机了&#xff0c;今天有空搞了个玩一下&#xff0c;红日5比前面的都简单。 靶机环境 win7&#xff1a;192.168.80.150(外)、192.168.138.136(内) winserver28&#xff08;DC&#xff09;&#xff1a;192.168.138.138 环境搭建就不说了&#xff0c;和之前写…

汽车IVI中控开发入门及进阶(三十七):基于HFP协议的蓝牙电话

概述: HFP全称Hands-free Profile,是一款让蓝牙设备控制电话的软件,多用于汽车上。此类设备最常见的例子是车载免提装置与蜂窝电话或可穿戴无线耳机一起使用。该配置文件定义了支持免提配置文件的两个设备如何在点对点的基础上相互交互。免提模式的实现通常使耳机或嵌入式免…

线程条件变量 生产者消费者模型 Linux环境 C语言实现

只能用来解决同步问题&#xff0c;且不能独立使用&#xff0c;必须配合互斥锁一起用 头文件&#xff1a;#include <pthread.h> 类型&#xff1a;pthread_cond_t PTHREAD_COND_INITIALIZER 初始化 初始化&#xff1a;int pthread_cond_init(pthread_cond_t * cond, NULL);…

AI技术在电商行业中的应用与发展

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

高通---Camera调试流程及常见问题分析

文章目录 一、概述二、Camera配置的整体流程三、Camera的代码架构图四、Camera数据流的传递五、camera debug FAQ 一、概述 在调试camera过程中&#xff0c;经常会遇到各种状况&#xff0c;本篇文章对camera调试的流程进行梳理。对常见问题的提供一些解题思路。 二、Camera配…

高危端口汇总(Summary of High-Risk Ports)

高危端口汇总 能关闭就关闭 &#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解…

贪心算法实例-问题分析(C++)

贪心算法实例-问题分析 饼干分配问题 有一群孩子和一堆饼干&#xff0c;每个小孩都有一个饥饿度&#xff0c;每个饼干都有一个能量值&#xff0c;当饼干的能量值大于等于小孩的饥饿度时&#xff0c;小孩可以吃饱&#xff0c;求解最多有多少个孩子可以吃饱?(注:每个小孩只能吃…

图像处理网络中的模型水印

论文信息&#xff1a;Jie Zhang、Han Fang、Weiming Zhang、Wenbo Zhou、Hao Cui、Hao Cui、Nenghai Yu&#xff1a;Model Watermarking for Image Processing Networks 本文首次提出了图像处理网络中深度水印问题&#xff0c;将知识产权问题引入图像处理模型 提出了第一个深…