C语言字符函数与字符串函数:编织文字的舞会之梦(下)

欢迎来到白刘的领域   Miracle_86.-CSDN博客

系列专栏  C语言知识

先赞后看,已成习惯

   创作不易,多多支持!

目录

七、strncpy的使用以及模拟实现

 八、strncat的使用以及模拟实现

九、strncmp的使用以及模拟实现

十、strstr的使用以及模拟实现

十一、strtok的使用

十二、strerror的使用


七、strncpy的使用以及模拟实现

char* strncpy(char* destination, const char* source, size_t num);

在上篇中,我们学到了strcpy,知道了它是用来拷贝字符串的:

C语言字符函数与字符串函数:编织文字的舞会之梦(上)-CSDN博客

这个strncpy,它相比较strcpy多了个字母n,我们再来看上面的函数原型,多了个size_t类型的num,这个n是代表num个字符。也就是说这个函数可以指定拷贝几个字符。

1.原理:将源的前 num 个字符复制到目标。如果源 C 字符串的末尾(由 null 字符表示)在复制 num 字符之前找到,destination 用零填充,直到写入总共 num 个字符。

2.拷贝num个字符从源字符串到目标空间

3.如果源字符串的长度小于num,则拷贝完源字符串后,在目标的后面追加0,直到num个。

来看它的使用:

#include <stdio.h>
#include <string.h>
int main()
{char src[40];char dest[40];strncpy(src, "Hello World",12);strncpy(dest, src,15);printf("最终的目标字符串:%s\n", dest);return 0;
}

这里编译器给出警告,也就是我们说的追加0:

strncpy的模拟实现,根据原理其实很好操作:

char* mystrncpy(char* dst, const char* src, size_t n)
{int i;for (i = 0; src[i] && i < n; i++){dst[i] = src[i];}if (i < n){dst[i] = 0;}return dst;
}

 八、strncat的使用以及模拟实现

char* strncat(char* destination, const char* source, size_t num);

同理,仿照strncpy,这个应该是追加num个字符到目标空间。

1.将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字符。

2.如果source 指向的字符串的⻓度⼩于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾。

直接上代码:

/* strncat example */
#include <stdio.h>
#include <string.h>
int main()
{char str1[20];char str2[20];strcpy(str1, "To be ");strcpy(str2, "or not to be");strncat(str1, str2, 6);printf("%s\n", str1);return 0;
}

再来看模拟实现:

char * mystrncat(char * dst, const char * src, size_t n)
{char * tmp = dst;while (*dst){dst++;}int i;for (i = 0; src[i] && i < n; i++){dst[i] = src[i];}dst[i] = 0;return tmp;
}

九、strncmp的使用以及模拟实现

int strncmp(const char* str1, const char* str2, size_t num);
⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0。

我们来看模拟实现:

int Mystrncmp(const char* str1, const char* str2, int n)
{assert(str1 != NULL && str2 != NULL);while (n-- && *str1 == *str2){str1++;str2++;}return *str1 - *str2;
}

将n放进循环中再自减,达到比较n个字符这一效果。

十、strstr的使用以及模拟实现

这个其实不太好想是什么意思,单从字面上来讲,放了两个str是什么意思呢?我们来看函数原型:

char* strstr(const char* str1, const char* str2);

 其实这个函数是用来返回字符串str2在字符串str1中第一次出现的位置。

细节注意:字符串的比较的不包含字符'\0',以'\0'作为结束标准。

#include <stdio.h>
#include <string.h>
int main()
{char str[] = "This is a simple string";char* pch;pch = strstr(str, "simple");strncpy(pch, "sample", 6);printf("%s\n", str);return 0;
}

 运行结果:

模拟实现:

思路:首先str2可以是'\0',如果是的话,直接返回str1的地址。接下来我们创建一个指针cp来指向str1,然后将其放进循环,我们还需要两个指针分别指向两个字符串,然后遍历一一对照是否相等。

char* strstr(const char* str1, const char* str2)
{char* cp = (char*)str1;char* s1, * s2;if (!*str2)return((char*)str1);while (*cp){s1 = cp;s2 = (char*)str2;while (*s1 && *s2 && !(*s1 - *s2))s1++, s2++;if (!*s2)return(cp);cp++;}return(NULL);
}

十一、strtok的使用

char* strtok(char* str, const char* sep);

这个函数是用来分割字符串的。

1.sep参数指向⼀个字符串,定义了⽤作分隔符的字符集合。

2.第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标记。

3.strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷⻉的内容并且可修改。)

4.strtok函数的第⼀个参数不为 比特就业课主页:https://m.cctalk.com/inst/s9yewhfr

NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串中的位置。

5.strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标记。

6.如果字符串中不存在更多的标记,则返回 NULL 指针。

#include <stdio.h>
#include <string.h>int main()
{char arr[] = "192.168.6.111";char* sep = ".";char* str = NULL;for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep)){printf("%s\n", str);}return 0;
}

其实就记住,str是要分割的字符串,sep是字符的集合,str里面有sep里的元素,然后这个函数会找到str中要分割的那个点(也就是sep的元素),并且将其替换成'\0',返回值为首元素地址,同时也会记录'\0'之后的首元素地址。

十二、strerror的使用

char* strerror(int errnum);

error这个单词大家都知道,是错误的意思,那这个函数就是用来返回错误的。

strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在< errno.h>  这个头⽂件中说明的,C语⾔程序启动的时候就会使⽤⼀个全⾯的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会讲对应的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。
#include <errno.h>
#include <string.h>
#include <stdio.h>//我们打印⼀下0~10这些错误码对应的信息
int main()
{int i = 0;for (i = 0; i <= 10; i++) {printf("%s\n", strerror(i));}return 0;
}

在Window11+VS2022环境下输出结果如下:

再来举个栗子:

#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;
}

输出结果:

Error opening file unexist.ent: No such file or directory

也可以了解一下 perror函数

perror 函数相当于⼀次将上述代码中的第9⾏完成了,直接将错误信息打印出来。perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{FILE* pFile;pFile = fopen("unexist.ent", "r");if (pFile == NULL)perror("Error opening file unexist.ent");return 0;
}

输出结果是一样的:

Error opening file unexist.ent: No such file or directory

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

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

相关文章

设计模式之抽象工厂模式解析

抽象工厂模式 1&#xff09;问题 工厂方法模式中的每个工厂只生产一类产品&#xff0c;会导致系统中存在大量的工厂类&#xff0c;增加系统的开销。 2&#xff09;概述 a&#xff09;产品族 和 产品等级结构 产品等级结构&#xff1a;产品的继承结构&#xff1b; 产品族&…

华为ensp中ospf基础 原理及配置命令(详解)

CSDN 成就一亿技术人&#xff01; 作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; CSDN 成就一亿技术人&#xff01; ————前言———— OSPF 的全称是 Open Shortest Path First&#xff0c;意为“开放式最短路径优先”。是一种内部网关协…

银行OA系统|基于SpringBoot架构+ Mysql+Java+ B/S结构的银行OA系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

Occupancy 训练策略

损失函数 Dice Loss Dice Loss 是一种用于图像分割的损失函数&#xff0c;其灵感来自于Dice 系数&#xff0c;是一种衡量两个样本相似度的方法。Dice 系数定义为&#xff1a; Dice 系数 2 * TP / (2 * TP FP FN) 其中&#xff1a; TP&#xff1a;预测为正且真实值为正的像…

网易有道 3/22

一面还比较常规&#xff0c;二面真的是压力爆炸&#xff0c;还是感觉自己太菜了 一面计网部分直接就是垮了&#xff0c;二面的话面试官水平很高&#xff0c;根本就和我不是一个级别的&#xff0c;三言两语就知道了我的项目大致情况&#xff0c;然后不断拷打 项目问完了又问了…

OpenGL学习笔记【3】—— GLAD配置

一、为什么用GLAD 由于OpenGL驱动版本众多&#xff0c;它大多数函数的位置都无法在编译时确定下来&#xff0c;需要在运行时查询。所以任务就落在了开发者身上&#xff0c;开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。取得地址的方法因平台而异&…

超声波清洗机是用来干什么的?好用眼镜超声波清洗机不能错过

在快节奏的现代生活中&#xff0c;每一项提高效率和清洁效果的技术都值得我们关注。超声波清洗机就是这样一种技术的完美体现&#xff0c;它通过高频声波在液体中产生微小的气泡&#xff0c;这些气泡在压力作用下迅速爆炸&#xff0c;产生的强大冲击力能够深入物品的微小缝隙&a…

阿里云权益中心2024年五大上云优惠权益解析,助力用户优惠上云

上云首选&#xff0c;普惠好价&#xff0c;2024年阿里云通过权益中心为个人和企业用户提供五大上云优惠权益&#xff0c;为开发者和企业提供多款新老同享、续费同价产品&#xff1b;超150款免费试用产品&#xff1b;初创企业最高可得最低3500元&#xff0c;最高100万上云抵扣金…

Docker 安装 Skywalking以及UI界面

关于Skywalking 在现代分布式系统架构中&#xff0c;应用性能监控&#xff08;Application Performance Monitoring, APM&#xff09;扮演着至关重要的角色。本文将聚焦于一款备受瞩目的开源APM工具——Apache Skywalking&#xff0c;通过对其功能特性和工作原理的详细介绍&am…

Unity UGUI之Toggle基本了解

在Unity中&#xff0c;Toggle一般用于两种状态之间的切换&#xff0c;通常用于开关或复选框等功能。 它的基本属性如图&#xff1a; 其中&#xff0c; Interactable&#xff08;可交互&#xff09;&#xff1a;指示Toggle是否可以与用户交互。设置为false时&#xff0c;禁用To…

Leetcode 70.爬楼梯

心路历程&#xff1a; 这道题是之前学院的一道复试题&#xff0c;大家都没怎么刷过算法题&#xff0c;只记得当年凭借几次试错自己把这道题做出来了&#xff0c;当时也不知道动态规划之类的。 正常来讲&#xff0c;这种找不到循环结构的题一般都是递归解决。 注意的点&#x…

Java语法学习八之认识String类

String类的重要性 在C语言中已经涉及到字符串了&#xff0c;但是在C语言中要表示字符串只能使用字符数组或者字符指针&#xff0c;可以使用标准库提供的字符串系列函数完成大部分操作&#xff0c;但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想&#xff0c;而…

使用 Pytorch 和 Rasterio 的自定义地理空间数据加载器

地理空间数据在从遥感和城市规划到环境监测和灾害管理的各个领域发挥着至关重要的作用。在处理机器学习任务的地理空间数据时,准备自定义数据加载器对于有效加载、预处理和增强数据而不丢失其属性至关重要,特别是当输入图像具有超过 3 个波段时。 Rasterio确实是一个专门为有…

【嵌入式——QT】QT Charts

【嵌入式——QT】QT Charts 概述Qt提供的坐标轴类QChartQLineSeriesQValueAxis常见图表及用到的序列类图示代码示例 概述 QT Charts模块是一组易于使用的图表组件&#xff0c;它基于Qt的Graphics View架构&#xff0c;其核心组件是QChartView和QChart&#xff0c;QChartView父…

软硬件全开源,方案分享 | 旋钮温控器方案

温控器用于控制室内暖通设备&#xff0c;通过暖通设备为室内环境提供冷源和热源&#xff0c;从而调节室内温度环境&#xff0c;为人们提供舒适的生活环境。 旋钮式温控器更为结构简洁、操作简便&#xff0c;降低了用户的使用难度&#xff0c;提供智能化的控制方法&#xff0c;…

基于时空上下文(STC)的运动目标跟踪算法,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

java面试:常见的限流算法有哪些

1 什么是限流算法 限流算法是一种用于限制流量请求的频率或速率的算法&#xff0c;其目的是在高并发或大流量请求的情况下&#xff0c;保护系统服务的安全性和可用性。限流算法可以应对热点业务带来的突发请求、调用方bug导致的突发请求以及恶意攻击请求等情况。是一种系统保护…

使用 ONLYOFFICE API 构建 Java 转换器,在 Word 和 PDF 之间进行转换

文章作者&#xff1a;ajun 随着文档处理需求的增加&#xff0c;格式转换成为了一个重要的需求点。由于PDF格式具有跨平台、不易被篡改的特性&#xff0c;将Word格式(.docx)转换为PDF格式(.pdf)的需求尤为强烈。ONLYOFFICE作为一个强大的办公套件&#xff0c;提供了这样的转换功…

【Unity】CatlikeCoding SRP

Unity 自定义渲染管线 提示&#xff1a;基于CatlikeCoding SRP系列教程学习 学习链接&#xff1a;SRP 个人测试: Demo 相关记录以后有时间再更&#xff1a;

kotlin中使用ViewBinding绑定控件

kotlin中使用ViewBinding绑定控件 什么是ViewBinding&#xff1f; View Binding是Android Studio 3.6推出的新特性&#xff0c;主要用于减少findViewById的冗余代码&#xff0c;但内部实现还是通过使用findViewById。通过ViewBinding&#xff0c;可以更轻松地编写可与视图交互…