当前位置: 首页 > article >正文

C:字符串函数(完)-学习笔记

目录

前言:

1、strstr

1.1 strstr的使用

4.2 strstr的模拟实现

5、strtok

5.1 strtok函数的介绍

 5.2 strtok函数的使用

6、strerror


前言:

这篇文章将介绍strstr函数,strtok函数,strerror函数

1、strstr

1.1 strstr的使用

strstr  --- string string

在一个字符串中,找一个字字符串,找第一次出现的位置

 

我们来尝试使用strstr函数:

    char arr1[ ] = "abcdefabcdef ";
	char arr2[ ] = "def";
    char* ret = strstr(arr1, arr2);
	if (ret == NULL)
		printf("找不到\n");
	else
		printf("找到了,%s\n", ret);

这就是strstr函数的作用,通常用来找一个字符串。

4.2 strstr的模拟实现

我们来尝试一下模拟strstr函数(这里小编学的有点模糊,因此可能会有些问题,还望理解,如果后面有时间会来修改)

第一次匹配成功

上面是比较简单的场景,匹配一次便成功了,那如果需要多次匹配呢?

 

#include <stdio.h>
#include <string.h>
#include <assert.h>
const char* my_strstr(const char* str1, const char* str2)//只寻找,不希望改变,所以使用const修饰
{
	assert(str1 && str2);
	const char* s1 = str1;
	const char* s2 = str2;
	const char* cur = str1;//cur指针记可能的开始匹配的位置
	if (*str2 == '\0')//当str2是空字符串时,直接返回str1
		return str1;
	while (*cur)
	{
		//完成一次匹配
		s1 = cur;
		s2 = str2;
		while (*s1 && *s2 && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
			return cur;
		cur++;
	}
	return NULL;
}
int main()
{
	char arr1[ ] = "abcdefabcdef ";
	char arr2[ ] = "def";
    char* ret = my_strstr(arr1, arr2);
	if (ret == NULL)
		printf("找不到\n");
	else
		printf("找到了,%s\n", ret);
	return 0;
}

5、strtok

5.1 strtok函数的介绍

strtok的作用就是通过分隔符切割字符串

char * strtok ( char * str,const char * sep );
  •  sep参数指向一个字符串,定义了用作分隔符的字符集合
  • 第一个参数指定一个字符串,它包含了0个或者多个有sep字符串中一个或者多个分隔符分隔的标记
  • strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以被strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。
  • strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  • strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,直接下一个标记。
  • 如果字符串中不存在更多的标记,则返回NULL指针。

先来说明一下strtok的使用场景:

char arr1[ ] = " zhangsan@year.ch"

char arr2[ ] ="www.hawei.com"

char arr3[ ] = " 123.234.345"

我们来一句一句解释上面的介绍

sep参数指向一个字符串,定义了用作分隔符的字符集合

char arr1[ ] = " zhangsan@year.ch"

上面的字符串中的分隔符是哪些呢?

‘@’、‘.‘

我们将这些分隔符放在一起就叫做分隔符的集合

sep中方的就是"@ ."

如果你要切割字符串char arr1[ ] = " zhangsan@year.ch"

你可以写一个数组char str[ ] = "@ ."

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

char arr1[ ] = " zhangsan@year.ch"

这里面的标记有zhangsan,year,ch。

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

char arr1[ ] = " zhangsan@year.ch"

str开始会先找到zhangsan这个标记,并且把这个标记的结尾改为\0,也就是说会把@改为\0

zhangsan@year.ch

zhangsan\0year.ch

同时会返回指向这个标记的指针

由于strtok会改变被操作的字符串,所以为了防止字符串被修改,一般都会临时拷贝原字符串

从上图中我们可以看到arr1中的@被改为了\0,这样arr1就会被破坏。因此为了防止破坏原数组,我们可以这样使用

int main()
{
	char arr1[] = "zhangsan@year.ch";
	char sep[] = "@.";
	char buf[30] = { 0 };
	strcpy(buf, arr1);//临时拷贝arr1中字符串到buf中
	char * p = strtok(buf, sep);
	return 0;
}

这样我们可以随意修改buf中的元素而不会对原数组照成影响。

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

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

char arr1[ ] = " zhangsan@year.ch"

int main()
{
	char arr1[] = "zhangsan@year.ch";
	char sep[] = "@.";
	char buf[30] = { 0 };
	strcpy(buf, arr1);//临时拷贝arr1中字符串到buf中
	char * p = strtok(buf, sep);
	return 0;
}

1. 第一个参数不为 NULL 时

  • strtok函数的第一个参数不为NULL时,它接收一个字符串作为起始处理的对象(假设这个字符串为str)。
  • 函数会根据指定的分隔符(通常在后续调用中指定)在str中查找第一个分隔符。
  • 找到第一个分隔符后,它会将分隔符替换为'\0',这样就把原始字符串str分割成了两部分,函数返回的是分隔符之前的子字符串(第一个标记)。
  • 同时,strtok函数会在内部保存当前处理的位置,这个位置是指刚刚找到的分隔符之后的字符位置,以便后续继续处理字符串的剩余部分

2. 第一个参数为 NULL 时

  • strtok函数的第一个参数为NULL时,它不会再接收新的字符串,而是基于上一次调用strtok时保存的位置继续处理同一个字符串。
  • 它会从上次保存的位置开始,查找下一个分隔符,同样将分隔符替换为'\0',然后返回新的子字符串(下一个标记)。
  • 这个过程可以重复,直到字符串中没有更多的分隔符为止。

 5.2 strtok函数的使用

int main()
{
	char arr1[] = "zhangsan@year.ch";
	char sep[] = "@.";
	char buf[30] = { 0 };
	strcpy(buf, arr1);//临时拷贝arr1中字符串到buf中
	char* p = NULL;
	for (p = strtok(buf, sep); p != NULL; p = strtok(NULL, sep))
	{
		printf("%s\n", p);
	}
	return 0;
}

6、strerror

char * strerror (int errnum);

strerror 函数可以把参数部分错误码对应的错误信息的字符串地址返回来。 在不同的系统和C语言标准库的实现中都规定了一些错误码,一般是放在 errno.h 这个头文件中说明的,C语言程序启动的时候就会使用一个全局的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会将对应的错误码,存放在errno中,而一个错误码的数字是整数很难理解是什么意思,所以每一个错误码都是 有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。

errno变量用来记录该程序中的错误代码信息

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

这里每一个数字对应的都是一个错误码。这里只是为了展示一下错误信息,并不是函数strerror的用法。

关于用法小编目前还没有学到,等到后面再来补充。


结语:本篇文章到这里就结束了,希望能够对大家有所帮助。


http://www.kler.cn/news/311541.html

相关文章:

  • 北斗盒子TD20——水上作业的安全防线,落水报警守护生命
  • React 中的延迟加载
  • 音视频入门基础:AAC专题(10)——FFmpeg源码中计算AAC裸流每个packet的pts、dts、pts_time、dts_time的实现
  • AUTOSAR_EXP_ARAComAPI的5章笔记(6)
  • 高级java每日一道面试题-2024年9月18日-设计模式篇-JDK动态代理,CGLIB代理,AspectJ区别?
  • 组件封装有哪些注意事项—面试常问优美回答
  • 2024网站建设比较好的公司都有哪些
  • re题(35)BUUCTF-[FlareOn4]IgniteMe
  • Docker Redis 7.2.3 部署
  • Spark实操学习
  • 集合框架底层使用了什么数据结构
  • 关于 Goroutines 和并发控制的 Golang 难题
  • 【网络安全的神秘世界】目录遍历漏洞
  • AJAX Jquery $.get $.post $.getJSON
  • STP生成树
  • css 中 em 单位怎么用
  • 医疗数据分析师
  • Uniapp的alertDialog返回值+async/await处理确定/取消问题
  • 矿场工程车检测数据集 4900张 工程车 带标注voc yolo
  • Unity Transform 组件
  • 【GO开发】MacOS上搭建GO的基础环境-Hello World
  • 2024-1.2.12-Android-Studio配置
  • HttpMediaTypeNotAcceptableException: No acceptable representation问题解决方法
  • 解决使用nvm管理node版本时提示npm下载失败的问题
  • 选择排序
  • DPDK 简易应用开发之路 2:UDP数据包发送及实现
  • Day14:学生信息管理系统
  • 【Qt网络编程】Tcp多线程并发服务器和客户端通信
  • Laravel邮件发送:从配置到发邮件的指南!
  • 从零开始讲DDR(2)——DDR的核心技术