C语言进阶——字符函数和字符串函数(中)

news/2024/11/17 7:26:44/

🌇个人主页:_麦麦_

📚今日感言:博客写多了,容颜自然改变,许多时候,自己可能以为许多写过的博客都成了过眼云烟,不复记忆,其实他们仍是潜在的。在气质里,在谈吐上,在胸襟的无涯,当然也可能显露在生活和文字里。 

目录

一、前言

二、正文

        3.长度受限制的字符串函数

                ★strncpy

                 ★strncat

                ★ strncmp

         4.字符串查找

                ★strstr

                ★strtok


一、前言

       在麦麦的上一篇文章——字符函数和字符串函数(上),我们介绍了string.h库里常用的两种类型函数,分别是“求字符串长度函数”和“长度不受限制的字符串函数”这两大类,想必有些小伙伴们看完还是觉得不过瘾,那么接下来这一篇文章将为各位继续细致的为大家讲解剩下的字符函数和字符串函数。

二、正文

        3.长度受限制的字符串函数

                ★strncpy

                        ①函数介绍

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

● Copies the first num characters of source to destination. If the end of the source C string (which is signaled by a null-character) is found before num characters have been copied, destination is padded with zeros until a total of num characters have been written to it.

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

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

●所引用的头文件"string.h"

//示例代码,帮助大家理解strncpy函数的使用
#include <string.h>
#include <stdio.h>
int main()
{char arr1[20] = "";char arr2[] = "Happy new year!";printf("%s",strncpy(arr1, arr2, 5));return 0;
}

                       ②模拟实现

        strncpy的模拟实现与strcpy函数的模拟实现大体相似,只是有了指定大小的字符拷贝,具体代码如下: 

#include<stdio.h>
#include<string.h>
#include <assert.h>//strncpy模拟实现
char* my_strncpy(char* dest, const char* sorc, size_t num)
{assert(dest && sorc);	//避免传来空指针char* tmp = dest;while (num && (*dest++= *sorc++)){num--;}while(--num){*dest++ = '/0';}return tmp;
}
//strncpy示例代码
int main()
{char arr1[20] = "";char arr2[] = "Happy new year!";my_strncpy(arr1, arr2, 5);printf("%s", arr1);return 0;
}

                 ★strncat

                        ①函数介绍

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

●功能:实现指定大小的字符串追加

● 详细介:1:Appends the first num characters of source to destination, plus a terminating null-character.
●详细介绍2:If the length of the C string in source is less than num, only the content up to the terminating null-character is copied.

//示例代码,帮助大家理解strncat函数的使用
#include <string.h>
int main()
{char arr1[30] = "Welcome ";char arr2[]   = "to my blog!xxxx";strncat(arr1, arr2, 11);return 0;
}

                ★ strncmp

int strncmp(const char * str1,const char * str2, size_t num)

比较到出现另一个字符不一样或者一个字符串结束或者num个字符全部比较完

//示例代码,帮助大家理解strncmp函数的使用
#include <stdio.h>
#include <string.h>
int main()
{char arr1[] = "abcde";char arr2[] = "acdef";printf("%d\n", strncmp(arr1, arr2, 1));    //打印出来为:0return 0;
}

         4.字符串查找

                ★strstr

                        ①函数介绍

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

●功能:查找str1中是否存在str2

●返回值:有则返回第一个寻找到str2的内容位于str1的起始指针,无则返回空指针

●头文件:string.h

//示例代码,帮助大家理解strstr的使用
#include <stdio.h>
#include <string.h>
int main()
{char arr1[] = "abcdefbcd";char arr2[] = "bcd";char arr3[] = "adef";printf("%s %s\n", strstr(arr1, arr2), strstr(arr1, arr3));  //返回bcdedbcd (null)return 0;
}

                         ②模拟实现

        strstr模拟实现的思路:

                                            ⑴定义三个指针,分别是返回指针ret1判断指针1 text1判断指针 text2。

                                            ⑵ret指针用于返回,从str1的第一个字符开始,逐渐向后走,直到判断为所要寻找的字符串的首字符指针并返回该指针或是一直走到str1的‘\0’处,返回空指针

                                            ⑶判断流程:利用判断指针text1和text2,一一往后走并比较是否相等,如果不相等,就退出该ret指针所指向的字符的判断,进入下一字符的判断流程;若一直相等,直至text2指针所指向的字符为str2字符串的末尾结束标志'\0',则说明找到所寻字符串

                                            具体代码实现如下:

#include <assert.h>char* my_strstr(const char* str1, const char* str2)
{assert(str1 && str2);char* ret = str1;	//返回指针char* text1 = NULL;	//判断指针1char* text2 = NULL;	//判断指针2while (*ret){text1 = ret;	//判断指针1回归text2 = str2;	//判断指针2回归while (*text2++==*text1++)	//判断是否找到{if (*text2 == '\0')return ret;	//找到了}ret++;}if (*ret == '\0')	//找不到return NULL;
}

                ★strtok

                        ①函数介绍

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

功能:利用分隔符,分隔字符串

●sep参数是个字符串,定义了用作分隔符的字符集合

●第一个参数指定一个字符串,它包含了0个或者多个由于sep字符串中一个或者多个分隔符分隔的标记

●strtok函数知道str中的下一个标记,并将其用’\0‘结尾,返回一个指向这个标记的指针。(注:strtok函数会修改被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)

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

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

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

//strtok的使用演示1
#include <stdio.h>
#include <string.h>
int main()
{char arr1[] = "welcome@to#my.blog";char* p = "@.#";char arr2[30] = "";strcpy(arr2, arr1); //将数据拷贝一份,处理arr2数组内的内容printf("%s\n", strtok(arr2, p));printf("%s\n", strtok(NULL, p));printf("%s\n", strtok(NULL, p));printf("%s\n", strtok(NULL, p));return 0;
}

       想必有的小伙伴看完上面的函数介绍就写出了如上的strtok函数使用,但是这样写未免太接地气了,敲得手也很累,下面展示strtok实用的使用演示:

//strtok的模拟实现2
#include <stdio.h>
#include <string.h>
int main()
{char arr1[] = "welcome@to#my.blog";char* p = "@.#";char arr2[30] = "";char* ret = NULL;strcpy(arr2, arr1);    //拷贝字符串for (ret=strtok(arr2, p); ret != NULL; ret=strtok(NULL, p)){printf("%s\n", ret);}return 0;
}

 关注我 _麦麦_分享更多干货:_麦麦_的博客_CSDN博客-领域博主
 大家的「关注❤️ + 点赞👍 + 收藏⭐」就是我创作的最大动力!谢谢大家的支持,我们下期见!


http://www.ppmy.cn/news/22311.html

相关文章

DVWA-XSS(DOM)注入-Low-Medium-Hight

Low 先点个Select&#xff0c;静观其变 点击select以后url地址中多出来一个default参数&#xff0c;尝试这个注入点。 输入payload <script>alert(1)</script> 并提交Medium 1、先尝试<script>alert(1)</script>&#xff0c;并提交 这里不难看出…

【5】KVM | 虚拟机网络配置 | Nat网络 | Bridge网络

目录 网络模式 【1】Nat网络 【2】Bridge网络 网络模式 Qemu-kvm提供了三种网络模式 1、桥接(bridge)将虚拟机的网卡桥接到宿主机的物理网卡。虚拟机和宿主机处于同一个网络内使用同一个网段。相当于将虚拟机的网卡和宿主机的网卡接在同一台二层交换机上。2、NAT宿主机需要…

【设计模式之美 设计原则与思想:面向对象】06 | 理论三:面向对象相比面向过程有哪些优势?面向过程真的过时了吗?

在上两节课中&#xff0c;我们讲了面向对象这种现在非常流行的编程范式&#xff0c;或者说编程风格。实际上&#xff0c;除了面向对象之外&#xff0c;被大家熟知的编程范式还有另外两种&#xff0c;面向过程编程和函数式编程。面向过程这种编程范式随着面向对象的出现&#xf…

开拓大脑,思维upup(1)——赛马找最快

赛马找最快前言问题详解前言 本系列博客是我的一个尝试&#xff0c;开拓思维系列的内容是一些有趣的智力题&#xff0c;可以起到锻炼思维能力的作用&#xff0c;另外题目也是非常有趣&#xff0c;如果有感兴趣的小伙伴一定要关注博主的这一系列哦&#xff01; 问题 25匹马5条跑…

前端——周总结系列三

1 数组对象使用变量作为key加中括号 2 遍历数组异同 主要针对for…in&#xff0c; for…of &#xff0c;map遍历方法 for…in和for…of都可以遍历数组&#xff0c;其中for…of可以获取数组的每一项&#xff0c;for…in不仅可以获取每一项&#xff0c;也可以获取索引值 for…o…

MySQL的函数

目录 一.分类 聚合函数 概述 格式 操作 数学函数 操作1 操作2 操作3 字符串函数 操作1 操作2 操作3 操作4 日期函数 操作1 操作2 操作3 控制流函数 if逻辑判断语句 case when 语句 窗口函数 介绍 分类 序号函数 开窗聚合函数- SUM,AVG,MIN,MAX 分布函数-…

Web 应用渗透测试 01 - 命令注入(Code Injection)之 create_function

背景 这篇文章将讨论 PHP Web 应用中 create_function 的命令注入。命令注入&#xff0c;究其根源&#xff0c;都是未对用户提供的输入做合理过滤造成的。当然&#xff0c;编程语言本身内置的危险方法的使用&#xff0c;是命令注入频发的另一原因。 各种变成语言的危险方法有…

数据库面试题

数据库面试什么是事务?以及事务的ACID?请描述数据库的隔离级别视图和数据表的区别是什么?SQL优化:什么是索引?以及索引的应用?什么是事务?以及事务的ACID? 事务:事务是指严密逻辑的操作&#xff0c;要么都成功&#xff0c;要么都失败。 通俗一点说:一件事中有很多个环…