字符串函数和内存函数详解(2)

这篇具有很好参考价值的文章主要介绍了字符串函数和内存函数详解(2)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🐵本文会将会对剩余的字符串库函数内存函数进行讲解

字符串函数和内存函数详解(2),C语言知识点,c语言,算法,开发语言

1.strstr📚

1.1函数用法✏️

strstr函数原型:

字符串函数和内存函数详解(2),C语言知识点,c语言,算法,开发语言

strstr用于在字符串中找子串,strstr会返回str1中出现str2的起始地址,如果在str1中没有找到str2,则返回空指针

1.2具体实现🖊️

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

int main()
{
	char arr1[] = "i like chess";
	char arr2[] = "like";

	char* ret = strstr(arr1, arr2); 
	if (ret != NULL)
	{
		printf("%s", ret);
	}
	else
	{
		printf("没找到");
	}

	return 0;
}

strstr会返回arr1中第一次出现arr2的地址,这里就是'l'的地址,将其传给指针ret,在打印时会从'l'处依次向后打印,结果为like chess;如果arr2是字符串"abc"的话,strstr就会返回空指针,打印结果为没找到

1.3模拟实现✍🏻

字符串函数和内存函数详解(2),C语言知识点,c语言,算法,开发语言

让str1和str2从第一个地址开始比较,如果相等那str1和str2都向后走一个字节,如果str1和str2一直相等,就应该返回str1中出现str2的起始位置,所以这里应该再来一个指针p用来保存str1和str2比较时str1的起始位置

如果str1和str2进行比较时遇到不相等的字符,就说明从p位置处开始不可能找到str2,所以应先让p向后走一个字节,再让str1回到p处,比如上图中,str1和str2从起始位置开始比较,'a'和'b'不相等,那就说明从p位置处开始不可能出现str2,那么p应该向后走一个字节,再让str1指向p所指的地址;str2应该回到它的起始地址,这里应再定义两个个指针s1,s2,让str1和str2不变,让s1和s2进行比较

字符串函数和内存函数详解(2),C语言知识点,c语言,算法,开发语言

总结:如果相等s1和s2一直想后走,当s2遇到'\0'时说明str1里有str2,返回p,如果不相等,p向后走一个字节,s1指向p,s2指向str2,直到相等返回p

代码:

#include<stdio.h>
#include<assert.h>

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

int main()
{
	char arr1[] = "abbcde";
	char arr2[] = "bcd";
	char* ret = my_strstr(arr1, arr2);
	if (ret != NULL)
	{
		printf("%s\n", ret);
	}
	else
	{
		printf("没找到\n");
	}
	return 0;
}

2.strtok📚

2.1函数用法✏️

strtok函数原型:

字符串函数和内存函数详解(2),C语言知识点,c语言,算法,开发语言

strtok用于分割字符串,delimiters指定一个字符串,该字符串中包含分割str的分隔符,而str也指定一个字符串,在该字符串中,包含一个或多个分隔符分割的标记

strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针
strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串
中的位置
。比如:str指定的字符串是12345@qq.com,分隔符为@和.,第一个参数不为NULL,所以strtok会将第一个标记@改为\0,并记住这个位置,在第二次使用strtok时,可以将第一参数设为NULL,这样就会从上一次保存的位置开始找第二个标记
strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标

如果字符串中不存在更多的标记,则返回 NULL 指针。
由于strtok函数回改变源字符串,所以在使用strtok函数前,会临时拷贝一份源字符串,对拷贝后的字符串使用strtok函数

2.2具体实现🖊️

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

int main()
{
	char arr[] = "1234@qq.com";
	char buf[20] = { 0 };
	strcpy(buf, arr);
	char* p = "@.";
	char* ret = NULL;
	for (ret = strtok(buf, p); ret != NULL; ret = strtok(NULL, p))
	{
		printf("%s\n", ret);
	}

	return 0;
}

for循环的初始化部分只会进行一次,这样第一次使用strtok时第一个参数是buf,之后第一个参数都是NULL,这样就能分割整个字符串

打印结果:

字符串函数和内存函数详解(2),C语言知识点,c语言,算法,开发语言

3.strerror📚

3.1函数用法✏️

strerror函数原型:

字符串函数和内存函数详解(2),C语言知识点,c语言,算法,开发语言

strerror用于返回错误码所对应的错误信息

3.2具体实现🖊️

sterror函数通常是在出现错误码时使用该函数查看错误码所对应的错误信息,并不会特意使用,这里只是举个例子:比如查看1~9所对应的错误信息:

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

int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		char*ret = strerror(i);
		printf("%d: %s\n", i, ret);
	}
	return 0;
}

以下是打印结果:

字符串函数和内存函数详解(2),C语言知识点,c语言,算法,开发语言

------内存函数------

接下来会讲解memcpy,memmove,memcmp函数,字符串函数比如strcmp只能比较两个字符串,strcpy也只能拷贝字符串,但是在内存中的数据并非只有字符串,所以引入内存函数可以操作任意类型的数据

4.memcpy📚

4.1函数用法✏️

memcpy函数原型:

字符串函数和内存函数详解(2),C语言知识点,c语言,算法,开发语言

用于拷贝内存数据,destination指定目标字符串,source指定源字符串,num是要拷贝的字节数

4.2具体实现🖊️

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

int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[10] = { 0 };
	size_t num = 20; //将5个数全部拷贝到arr2,所以是20个字节
	memcpy(arr2, arr1, num);

	return 0;
}

通过调试观察,拷贝前:

字符串函数和内存函数详解(2),C语言知识点,c语言,算法,开发语言

拷贝后:

字符串函数和内存函数详解(2),C语言知识点,c语言,算法,开发语言

4.3模拟实现✍🏻

由于memcpy再拷贝时是一个字节一个字节拷贝的,所以应将des和src强转为字符指针,每完成一次拷贝就再强转为字符指针后+1,这样就能达到一个字节一个字节拷贝的目的

#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* des, const void* src, size_t n)
{
	assert(des && src);
	void* ret = des;
	while (n--)
	{
		*(char*)des = *(char*)src;
		des = (char*)des + 1;
		src = (char*)src + 1;
	}
	return ret;
}

5.memmove📚

5.1函数用法✏️

memmove函数原型:

字符串函数和内存函数详解(2),C语言知识点,c语言,算法,开发语言

可以发现memmove和memcpy的函数原型一致,其实memmove和memcpy用法基本一样,差别就是当源空间和目标空间重叠时可以使用memmove;

比如说一个整形数组int arr[] = {1,2,3,4,5,6,7,8,9};将3~7的位置拷贝到1~5的位置时可以memmove

5.2具体实现🖊️

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

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8 };
	size_t num = 16;
	memmove(arr + 2, arr, num);

	return 0;
}

通过调试观察,拷贝前:

字符串函数和内存函数详解(2),C语言知识点,c语言,算法,开发语言

拷贝后:

字符串函数和内存函数详解(2),C语言知识点,c语言,算法,开发语言

5.3模拟实现✍🏻

如果按照memcpy函数模拟实现的方法来模拟实现的话,无法达到预期目的(假如是将2~5拷贝到4~7的位置处):

字符串函数和内存函数详解(2),C语言知识点,c语言,算法,开发语言

当将2和3分别拷贝到4和5的位置后,在接下来要将4拷贝到6的位置时就已经无法达到目的了,因为此时4的位置已经被2拷贝过,再去拷贝到6的位置时,实际上是将2拷贝6的位置,那么整个拷贝操作结束后该数组会变为1 2 3 2 3 2 3 8,在这种des在src之后的情况下可以将src从后往前拷贝,5->7,4->6,3->5,2->4,这样就能达到拷贝的目的

反之当des在src之前时,应将src从前往后拷贝,这种情况下的模拟实现和memcpy一致

#include<stdio.h>
#include<assert.h>
void* my_memmove(void* des, const void* src, size_t n)
{
	assert(des && src);
	void* ret = des;
	if (des > src)
	{
		while (n--)
		{
			*((char*)des + n) = *((char*)src + n);
		}
	}
	else
	{
		while (n--)
		{
			*(char*)des = *(char*)src;
			des = (char*)des + 1;
			src = (char*)src + 1;
		}
	}
	return ret;
}

6.memcmp📚

6.1函数用法✏️

memcmp函数原型:

字符串函数和内存函数详解(2),C语言知识点,c语言,算法,开发语言

用于比较两个内存数据,ptr1和ptr2分别指定两个内存数据,num代表要比较的前num个字节

6.2具体实现🖊️

注意:这里比较的是前num个字节

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

int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 1,2,3,5,6 };
	size_t num = 0;
	scanf("%zd", &num);

	int cmp = memcmp(arr1, arr2, num);
	if (cmp > 0)
	{
		printf("arr1 > arr2\n");
	}
	else
	{
		printf("arr1 <= arr2\n");
	}

	return 0;
}

7.memset📚

7.1函数用法✏️

memset函数原型:

字符串函数和内存函数详解(2),C语言知识点,c语言,算法,开发语言

memset用来设置内存的,ptr指向一个内存数据,value是要设置的值,num是要设置的字节数

7.2具体实现🖊️

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

int main()
{
	char arr[] = "hello world";
	memset(arr + 6, 'x', 5);
	printf("%s", arr); 打印结果:hello xxxxx

	int arr[10] = { 0 };
	memset(arr, 1, 40); //这里并不会将arr里面变为10个1,因为他是一个字节一个字节设置的
//所以它将每个字节设为了1,那么就变成了10个非常大的数
//综上所述,memset适合于字符数组,或者将整形数组全部设为0
	return 0;
}

🙉至此,字符串函数和内存函数全部讲解完毕!后续将会讲解结构体、联合、枚举相关内容文章来源地址https://www.toymoban.com/news/detail-731666.html

到了这里,关于字符串函数和内存函数详解(2)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • C/C++字符函数和字符串函数详解————内存函数详解与模拟

    C/C++字符函数和字符串函数详解————内存函数详解与模拟

    个人主页:点我进入主页 专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶 C语言刷题 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.前言 2 .memcpy函数 3.memmove函数 4.memset函数  5.memcmp函数            前面学习了关

    2024年02月08日
    浏览(12)
  • c语言——字符串函数和内存操作函数

    c语言——字符串函数和内存操作函数

    包含在string.h头文件里 功能:返回字符串中有效字符的个数,遇到‘\\0’结束,不包括结束符‘\\0’. 函数的参数为------const char* str:字符指针 返回值的类型------size_t:无符号整数(即:unsigned int) 模拟实现strlen: 方法一:计数器的方法 方法二:不能创建临时变量的计数器

    2024年02月14日
    浏览(11)
  • C语言进阶---字符串+内存函数

    C语言进阶---字符串+内存函数

    重点介绍处理字符和字符串的库函数的使用和注意事项。 求字符串长度 strlen() 长度不受限制的的字符串函数 strcpy() strcat() strcmp() 长度受限制的的字符串函数 strncpy() strncat() strncmp() 字符串查找 strstr() strtok() 错误信息报告 strerror() 字符操作 内存操作函数 memcpy() memmove() memset(

    2024年02月12日
    浏览(9)
  • 进阶C语言——字符串和内存函数

    进阶C语言——字符串和内存函数

    今天我们学点库函数 字符函数和字符串函数 求字符串长度函数-strlen strlen需要的头文件是string.h ,那它的作用是什么呢?? 他是来求字符串长度的,统计的是’\\0’前的字符串长度 size_t是无符号的意思 学会了strlen函数怎么使用,那我们现在模拟实现一下strlen 之前讲过三种方

    2024年02月16日
    浏览(13)
  • 金丹三层 —— 内存函数和字符串操作函数详解

    金丹三层 —— 内存函数和字符串操作函数详解

    目录 一.修炼必备 二.字符串操作的常用函数 2.1 strlen()函数 2.2 strcpy()函数 2.3 strcat()函数 2.4 strcmp()函数 2.5 strstr()函数 2.6 strtok()函数 2.7 strerror()函数 三.内存操作的常用函数 3.1 memcpy()函数 3.2 memmove()函数 3.3 memcmp()函数 结语 1.入门必备:VS2019社区版,下载地址:Visual Studio 较旧的

    2023年04月08日
    浏览(13)
  • 【C语言】字符函数与字符串函数以及内存函数 { 超详细攻略,一篇学会 }

    【C语言】字符函数与字符串函数以及内存函数 { 超详细攻略,一篇学会 }

    今日分享:字符、字符串函数和内存函数 内存函数 就是对内存进行操作的函数 字符串函数 就是对字符串进行操作的函数 字符函数 就是对字符进行操作的函数 str 前缀的函数是字符串函数,头文件string.h mem 前缀的函数是内存函数,头文件stdlib.h 字符分类函数包含在 ctype.h 头

    2024年03月18日
    浏览(14)
  • 【c语言:常用字符串函数与内存函数的使用与实现】

    【c语言:常用字符串函数与内存函数的使用与实现】

    简介:本篇文章是对C语言中常用的字符串函数和内存函数的学习以及模拟实现 文档内容来自:https://legacy.cplusplus.com/ 字符串以 ‘\\0’ 作为结束标志, strlen函数返回的是在字符串中 ‘\\0’ 前⾯出现的字符个数( 不包含 \\\'\\0\\\' )。 参数指向的字符串必须要以 ‘\\0’ 结束。 注意函

    2024年02月04日
    浏览(11)
  • C语言字符函数和字符串函数详解

    C语言字符函数和字符串函数详解

           Hello, 大家好,我是一代,今天给大家带来有关字符函数和字符串函数的有关知识        所属专栏:C语言        创作不易,望得到各位佬们的互三呦 在C语言中有一些函数是专门为字符设计的,这些函数的使用都需要包含一个头文件ctype.h 如:(注:以下函数原型都

    2024年03月20日
    浏览(16)
  • C语言——详解字符函数和字符串函数(一)

    C语言——详解字符函数和字符串函数(一)

    Hi,铁子们好呀!今天博主来给大家更一篇C语言的字符函数和字符串函数~ 具体讲的内容如下: 前言: 在编程的过程中,我们经常要处理字符和字符串,C语言标准库中提供了一系列库函数,接下来我们就学习一下这些函数。 众所周知,C语言中提供了一系列的字符函数,这些

    2024年03月17日
    浏览(9)
  • C语言——详解字符函数和字符串函数(二)

    C语言——详解字符函数和字符串函数(二)

    Hi,铁子们好呀!之前博主给大家简单地介绍了部分 字符和字符串函数 ,那么这次,博主将会把这些字符串函数给大家依次讲完! 今天讲的具体内容如下: 6.1.1 strcmp 函数介绍 它的函数原型如下: 具体的函数介绍如下图所示: 从图中我们得知: - 如果第一个字符串 PTR1 大于

    2024年04月10日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包