你应该知道的C语言干货(4)(strncpy,strncmp,strncat,strstr,strtok)

news2024/11/28 6:31:10

我们知道包含string.h头文件后,就可以使用strncpy,strncmp,strncat,strstr,strtok这些库函数,接下来让我们了解他们。

 

目录

        #strncpy

        #strncmp

        #strncat

        #strstr

        #strtok

        #下期预告


#strncpy

该库函数作用和strcpy很相似,不同点在于

发现了吗,strncpy多了一个size_t num,这是要拷贝的字符数目,而strcpy是全拷贝。 

废话不多说,来看代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

int main()
{

	char str1[30] = "XXXXXXXXXXXXXX";
	char str2[20] = "hahaha";
	strncpy(str1, str2, 7);


	return 0;
}

如果说num小于str2的长度,正常复制

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

int main()
{

	char str1[30] = "XXXX";
	char str2[20] = "hahaha";
	strncpy(str1, str2, 5);

	return 0;
}

因为初始化时,剩下的空间都初始化了,如果石str1未初始化,就会是这样:

str2末尾没有\0,还需要自己再加,如果全部复制,不初始化str1也ok,但最好初始化

如果要复制的长度大于str2,也就是源字符串,那么多出来的部分拷贝\0

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

int main()
{

	char str1[30] = "XXXXXXXXXXXXXXXXXXX";
	char str2[20] = "hahaha";
	strncpy(str1, str2, 10);

	return 0;
}

#strncmp

 这个和上面类似,比较num个字符,直到这n个字符都比完,比较方式同strcmp函数

#strncat

同样的道理,向str1的末尾追加num个以str2为首地址开始的字符 ,但是有一些和strncpy不同的区别,看图:

这个很正常,都可以理解,接下来看好了:

哈?我明明只追加6个字符,没追加最后的\0啊?

是的 ,strncat不管追加多少字符,都会在追加的最后自己加上\0,那么这样呢?

即使超过源字符串长度,他不会像strncpy那样补\0,他只追加一个\0 

#strstr

该库函数作用是在一个字符串中找另一个字符串,并返回那个找到的字符串的首位置,若没有找到,返回NULL。

接下来我们模拟实现他

(这里最好的算法是KMP算法,在数据结构里会讲到,这里没有用到)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

const char* my_strstr(const char* str_orign, const char* str_find)
{
	const char* orign = str_orign;
	const char* p1 = orign;
	const char* p2 = str_find;

	while (*orign)
	{
	
		p1 = orign;
		p2 = str_find;

		while (*p1 && *p2 && (*p1 == *p2))
		{
			p1++;
			p2++;
		}
		if (*p2 == '\0')
			return orign;

		orign++;
	}

	return NULL;
}

//模拟实现strstr
int main()
{

	char str_orign[30] = "da wu wo x ni wo......";
	char str_find[20] = "woo";
	const char* p = my_strstr(str_orign, str_find);

	if (p != NULL)
		printf("%s", p);
	else
		printf("Can not find it\n");
	return 0;
}

#strtok

这是个用来分割字符串的函数,sep是存放分隔符的,没有先后顺序之分,str则是我们要分割的字符串,看代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

int main()
{

	char str[30] = "haha.hehe#hiahia*";
	char sep[10] = ".#*";

	printf("%s", strtok(str, sep));

	return 0;
}

 咦,奶奶个腿滴,感觉咋不对劲呢,为什么没有全部分割呢?

接下来讲讲这个函数的原理:

strtok函数会找到str中的下一个标记,并将其末尾用\0结尾,也就是将分隔符换成\0,返回一个指向这个标记的指针,也就是说,我们第一次使用strtok时,返回的标记指向haha的h,然后我们打印时遇到\0停止:

所以我们打印出来haha,那么如何分割剩下的字符串呢?

 接下来看代码,这么用:

#include <stdio.h>
#include <string.h>

int main()
{

	char str[30] = "haha.hehe#hiahia*";
	char sep[10] = ".#*";

    char* temp;
    for (temp = strtok(str, sep); temp != NULL; 
                      temp = strtok(NULL, sep))
    {
	    printf("%s\n", temp);
    }

	return 0;
}

接下来传的就是NULL空指针,函数将从我们第一次使用后保存的位置开始查找下一个标记,找到后将其末尾分隔符换成\0,返回标记,看这次我们的打印结果:

分隔成功~  

#下期预告

内存函数:

memset

memcpy

memmove

memcmp

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

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

相关文章

《面试1v1》Redis分片集群

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

Redis Brpop 命令

目录 一、作用二、demo演示 一、作用 Redis Brpop 命令拥有移出并获取list右边的最后一个元素&#xff0c; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 二、demo演示 向 list1 中插入三个元素 a、b、c lpush list1 a b c查看list1中的元素 lrange lis…

操作系统13:中断处理程序和设备驱动程序

目录 1、中断处理程序 &#xff08;1&#xff09;中断和陷入 &#xff08;2&#xff09;中断处理程序的处理过程 2、设驱动程序 &#xff08;1&#xff09;设备驱动程序的功能 &#xff08;2&#xff09;设备驱动程序的处理过程 &#xff08;4&#xff09;对 I/O 设备的…

Mac 和 Win,到底用哪个系统学编程?

今天来聊一个老生常谈的问题&#xff0c;学编程时到底选择什么操作系统&#xff1f;Mac、Windows&#xff0c;还是别的什么。。 作为一个每种操作系统都用过很多年的程序员&#xff0c;我会结合我自己的经历来给大家一些参考和建议。 接下来先分别聊聊每种操作系统的优点和不…

React懒加载/动态加载lazy简单实例

两种页面嵌套的方式&#xff0c;一种是父子组件&#xff0c;一种是懒加载 1、父子组件&#xff08;可略&#xff0c;只用来做例子对比&#xff09; 原本需要用父子组件来实现页面嵌套&#xff0c;如果嵌套的组件不多&#xff0c;可以这样实现 父页面 import React,{Componen…

Android代码解读之渲染机制揭秘

问题 1.vsync如何协调应用和SurfaceFlinger配合来完成UI渲染、显示&#xff0c;App接收vsync后要做哪些工作&#xff1f; 2.requestLayout和invalidate区别&#xff1f; 3.performTraversals到底是干什么了&#xff1f; 4.surfaceflinger怎么分发vsync信号的&#xff1f; …

【Java】继承背后那些事---深扒继承基本原理|类加载、子类对象创建、方法调用、变量访问

博主简介&#xff1a;努力学习的预备程序媛一枚~博主主页&#xff1a; 是瑶瑶子啦所属专栏: Java岛冒险记【从小白到大佬之路】 学习了继承、多态 本节&#xff0c;将通过一个简单的例子&#xff0c;从概念上介绍原理&#xff08;实际实现的细节与此有所差别&#xff09;&#…

HuggingGPT解析:使用 ChatGPT及HuggingFace上的族系解决AI问题

HuggingGPT解析&#xff1a;使用 ChatGPT及HuggingFace上的族系解决AI问题 HuggingGPT是一个利用大型语言模型(LLMs)来解决复杂AI任务的框架。其基本理念是&#xff0c;考虑到LLMs&#xff08;例如ChatGPT&#xff09;在语言理解、生成、交互和推理方面展现出了卓越的能力&…

一个优质软件测试工程师简历的范文(答应我一定要收藏起来)

很多刚转行软件测试的小伙伴是不是不知道怎么写好一份优质的软件测试工程师的简历。今天呢&#xff0c;就给大家分享一下一个优质软件测试工程师简历的范文。记得收藏起来哦。 下面的案例&#xff1a;2-3年的软件测试工程的简历 姓 名&#xff1a;XXX 学历&#xff1a;本科 …

源码解析Collections.sort ——从一个逃过单测的 bug 说起

源码解析Collections.sort ——从一个逃过单测的 bug 说起 本文从一个小明写的bug 开始&#xff0c;讲bug的发现、排查定位&#xff0c;并由此展开对涉及的算法进行图解分析和源码分析。 事情挺曲折的&#xff0c;因为小明的代码是有单测的&#xff0c;让小明更加笃定自己写的…

第四节 配置SpringBootAdmin日志管理

本来想用一节就写完SpringBootAdmin的&#xff0c;但随着研究的深入发现一节应该是不够的&#xff0c;网上的资料也不会非常系统&#xff0c;官网的例子有些已经好几年没更新了&#xff0c;所以接下来还是系统性的来写下吧 第一节 完成基础配置&#xff0c;暴露所有端点 第二节…

uniapp App强制更新

需要使用DClound插件市场的一个插件挺好用的&#xff01;app升级、整包更新和热更新组件 支持vue3 支持打开安卓、苹果应用市场&#xff0c;wgt静默更新https://ext.dcloud.net.cn/plugin?id7286 开始贴代码 // /utils/method.js/*** 获取当前app最新版本* param number ver…

【JAVA】这几个JAVA学习网站你绝不能错过(教学课程篇)

个人主页&#xff1a;【&#x1f60a;许思王】 文章目录 前言HOW2J.CNw3cschool菜鸟教程慕课网开课吧黑马程序员B站 前言 JAVA很难学&#xff1f;学不会怎么办&#xff1f;找对学习网站&#xff0c;让你轻松解决困难。 HOW2J.CN HOW2J.CN是我自认为最好的JAVA学习网站&#x…

df -h 查看Used+Avail != Size

问题描述&#xff1a; 在测试过程中发现&#xff0c;该机器的根目录空间 41G 5.7G ! 50G&#xff0c;即 Used Avail ! Size 问题原因&#xff1a; 经过搜索&#xff0c;了解到这种情况可能是Linux系统默认的文件保留块导致的&#xff08;Linux系统默认保留5%的容量作为应急…

论文 | 一分钟快速找到自己研究领域的顶刊

1. 打开Web of Science https://www.webofscience.com/wos/alldb/basic-search 2. 点击右上角&#xff1a;产品&#xff0c;再选中&#xff1a;Journal Citation Reports 至于JCR是什么&#xff0c;请看下面的拓展部分 3. 单击顶部的 Categories Categories 是分类、类别的…

LaTeX 速查手册

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

MachineLearningWu_11_NeuralNetworkLayer

x.1 Neural Network layer design 我们接下来来讲解一下深度学习中&#xff0c;神经网络是如何架构的。对于一个具有两层的的神经网络&#xff0c;我们将输入层置为layer0&#xff0c;将第一层隐藏层置为layer1&#xff0c;将 w 2 [ 1 ] w_2^{[1]} w2[1]​标记为第一层中&…

nginx基本使用

这是一份完整的nginx配置文件&#xff1a; #user nobody; worker_processes 1;#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024; }http {include mi…

23款奔驰GLS450更换迈巴赫GLS600外观套件,尽显奢华

在外观上不要过分的张扬&#xff0c;低调的同时还要彰显强大的气场&#xff0c;换装迈巴赫专属套件&#xff0c;迈巴赫专属踏板&#xff0c;还有迈巴赫的醒目M标志&#xff0c;车身轮廓和线条方面&#xff0c;奔驰GLS450和迈巴赫GLS600尺寸及其契合&#xff0c;只需通过增加一些…

LayUi基础入门【附有案例从0到1详解】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于LayUi的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.LayUi的创作背景 二.LayUi是什么 三.…