《strstr()、strtok()、strerror()》函数讲解,全网最细干货!

🦁strstr

请先看函数标准:

头文件:# include<string.h>

在这里插入图片描述

在这里插入图片描述

这个函数是字符串查找函数,意思是:在str1字符串中找str2字符串第一次出现的位置,如果没有找到str2,返回的是一个char*的空指针,如果找到了多个str2,则返回的是第一次str2出现的位置!!!

函数参数分析

char strstr 表示返回的一个指针*

char str1 表示目标空间的地址*

char str2 表示源空间的地址*

下面,我们实现一下函数功能,结合代码进行讲解:

第一种情况:

当str1字符串中包含了一次str2的字符串

#include <stdio.h>
#include <string.h>
int main()
{
	char str1[] = "abcdef";
	char str2[] = "cdef";
	char* p = strstr(str1, str2);
	if (p == NULL)
	{
		printf("没找到\n");
	}
	else
		printf("%s", p);
	return 0;
}

在这里插入图片描述

当在str1中找到str2时,就会返回出现的str2字符串处地址。

第二种情况:

当str1中不包含str2字符串时

在这里插入图片描述

就会返回一个空指针!!!

第三种情况:

当str1中多次出现str2字符串时

在这里插入图片描述

返回的是第一次出现str2字符串处的地址!

strstr()函数的模拟实现

#include <stdio.h>
char* my_strstr(char* str1, char* str2)
{
	char* p = str1;
	while (*p)
	{
		char* s1 = p;
		char* s2 = str2;
		while (*s1 && *s2 && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return p;
		}
		p++;
	}
	return NULL;
}
int main()
{
	char str1[] = "abbcdef";
	char str2[] = "bcde";
	char* ret = my_strstr(str1, str2);
	if (ret != NULL)
	{
		printf("%s\n", ret);
	}
	else
		printf("没有找到\n");
	return 0;
}

拓展:

另外再给大家拓展两个函数:strchr() strrchr()

strchr()函数是**:假如说,在一个字符串中寻找字符b出现的位置,那么寻找的就是b第一次出现的位置,找到了就返回这个位置处的地址,没找到就i返回NULL**,上代码

在这里插入图片描述

strrchr()函数是:与函数strchr()一样,也是在字符串中寻找字符,但是,它找到的是最后一次出现字符的位置,返回的是最后一次出现字符位置出的地址!上代码

在这里插入图片描述

🦁strtok

下面给大家介绍一个函数,这个函数用起来可能有点古怪😁,下面请先看文件:

在这里插入图片描述

在这里插入图片描述

strtok()分割函数:

头文件:stdio.h<string.h>

delimiters 表示参数是个字符串,定义了用作分隔符的字符集合

str 表示参数是一个字符串,它包含了由0个或多个由delimiters字符串中一个或多个分隔符分割的标记 !

意思就是是:delimiters 中的字符串就是被str中的某些字符切割开来的。

下面请看讲解:

比如有这样一个数组:

int main()
{
	char str[] = "test.zbc/fgh@jkl";//假设这样一个字符串
    char delimiters[] = "./@";//str中的字符串就是被这些字符给分开的。
}

干货

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

什么意思呢?就是比如说在 "test . zbc/ fgh @ jkl"字符串中,当开始遍历字符串时,遍历完test时,就遇到了我们的分隔符,所以就把test当做一个标记。就把标记后面的一个 . 直接改成‘\0’,并且返回这个标记的指针,就是t的地址。还有就是,一般我们只是切割一下,但是并不想改变源字符串,所以把源字符串拷贝到另一个数组中。对另一个数组进行操作!

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

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

因为我们刚才已经查到 . 这个位置了,所以这个位置就会被保存,当下一次开始查找的时候,第一个参数传NULL,直接就从从==.==这个位置开始查找,所以在进行函数的第二次调用,第三次调用时,第一个参数就不要再传字符了,直接传空指针就行了。

下面用代码为大家解释:

int main()
{
	char arr[] = "test.zbc/fgh@jkl";
	char str[30] = { 0 };
	strcpy(str, arr);
	const char* p = "./@";
	char * pc = strtok(str, p);
	printf("%s\n", pc);
	
	pc = strtok(NULL , p);
	printf("%s\n", pc);

	pc = strtok(NULL, p);
	printf("%s\n", pc);
	return 0;
}

在这里插入图片描述

但是看着有一些死板,如果这个分隔符很多,字符串很长的话,一直在后面调用strtok函数么,下面我们对这个代码进行优化!

int main()
{
	char arr[] = "test.zbc/fgh@jkl";
	char str[30] = { 0 };
	strcpy(str, arr);
	const char* p = "./@";
	char* pc = NULL;
	for (pc = strtok(str, p); pc != NULL; pc = strtok(NULL, p))//直接写成for循环的条件
	{
		printf("%s\n", pc);
	}
	return 0;
}

🦁strerror

函数功能:返回错误码的错误信息

头文件:#include<string.h>

在这里插入图片描述

在这里插入图片描述

我们可以看到它的接受参数是int errnum,它是在调用的时候传过去一个错误码数字,然后把这个数字转化成对应的错误信息,因为错误信息是个字符串,所以它的返回类型是char* 的,他把这个错误码的首字符地址给返回过去了。

下面实现一下这个代码:

int main()
{
	char* ret = strerror(0);
	printf("%s\n", ret);
	
	ret = strerror(1);
	printf("%s\n", ret);

	ret = strerror(2);
	printf("%s\n", ret);

	ret = strerror(3);
	printf("%s", ret);
	return 0;
}

在这里插入图片描述

那这个函数就是这么用的么,其实并不然,这只是一个简单的演示,其实,C语言的库函数在调用失败的时候,会将一个错误码放在一个叫:errno的变量中,当我们想知道调用库函数的时候发生了什么错误信息,就可以将errno中的错误码翻译成错误信息:

下面代码演示一下:

#include<errno.h>
int main()
{
	//打开文件
	//打开文件的时候,如果文件的打开方式是"r"
	//文件存在则打开成功,文件不存在则打开失败
	FILE* str = fopen("text.txt","r");
	if (str == NULL)
	{
		printf("打开文件失败,原因是:%s", strerror(errno));
		return 1;
	}
	//读写文件
	//.....
	//关闭文件
	fclose(str);
	str = NULL;
	return 0;
	
}

在这里插入图片描述

打开失败,因为在我们当前路径下面是没有text.txt的文件的

在这里插入图片描述

下面我们在当前路径里面创建一个text.txt的文件

在这里插入图片描述

看,现在就打开成功了!!!

还有要注意的一点是errno:

假如我们写了两个库函数:

库函数1 和库函数2,如果库函数1调用失败的话,如果不进行检查的话,库函数1的失败原因会存储到errno中,但是如果库函数2调用成功的话,会把errno中的错误信息给覆盖掉的!!!

关于errno这个函数就只是存储错误信息而已,方便以后在调用函数出错时查看错误信息,当然打印错误信息的函数我不得不再提一个,那就是perror 这个函数,这个函数更加直接:

在这里插入图片描述

他就自动在后面加上了错误信息!!!

  • 13
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: `strstr` 是 C 语言标准库中的一个字符串处理函数,用于在一个字符串中查找另一个字符串的出现位置。其函数原型如下: ```c char *strstr(const char *str1, const char *str2); ``` 其中,`str1` 是要查找的字符串,`str2` 是要查找的子串。函数返回值是指向 `str1` 中第一次出现 `str2` 的位置的指针,如果没有找到则返回 `NULL`。 下面是一个示例代码: ```c #include <stdio.h> #include <string.h> int main() { char str1[] = "Hello, world!"; char str2[] = "world"; char *p = strstr(str1, str2); if (p) { printf("'%s' is found in '%s' at position %ld.\n", str2, str1, p - str1); } else { printf("'%s' is not found in '%s'.\n", str2, str1); } return 0; } ``` 输出结果为: ``` 'world' is found in 'Hello, world!' at position 7. ``` 该程序首先声明了两个字符串 `str1` 和 `str2`,然后使用 `strstr` 函数在 `str1` 中查找 `str2`,如果找到则输出位置信息,否则输出未找到信息。 ### 回答2: strstr是字符串处理库中的一个函数,其原型为char* strstr(const char* str1, const char* str2)。该函数用于在一个字符串str1中查找另一个字符串str2的第一次出现,并返回该位置的指针。 函数strstr的工作过程为: 1. 首先,函数会从字符串str1的首字符开始逐个比较,直到str1的末尾。 2. 对于每个字符位置i,函数会从str1的i位置开始逐个比较str1和str2的字符。 3. 如果比较过程中发现有字符不相等,就会继续从str1的下一个字符开始重复上述过程。 4. 如果直到str2的末尾都能对应相等的字符,就表示找到了str2在str1中的第一次出现的位置,此时函数会返回该位置的指针。 5. 如果比较过程中str1已经遍历完了还没有找到匹配,那么就表示不存在str2在str1中的出现,此时函数将返回空指针(NULL)。 需要注意的是,函数strstr只能用于查找子串在主串的第一次出现位置,如果要查找所有的匹配位置或者更复杂的操作,需要使用其他的字符串处理函数函数strstr的用途广泛,常用于实现字符串的查找和匹配。比如,可以用它来查找一个文件路径中的文件名,或者在一个长文本中查找某个关键词等。在实际编程中,可以根据strstr的返回值进行相应的操作,如打印或修改字符串的内容等。 总结起来,strstr函数是C语言中用于在一个字符串中查找另一个子串的函数,返回子串在字符串中第一次出现的位置。 ### 回答3: strstr是C语言中的一个字符串处理函数,它用于在一个字符串中搜索另一个字符串第一次出现的位置。 函数原型: char *strstr(const char *str1, const char *str2); 参数说明: str1:要进行搜索的字符串。 str2:要搜索的目标字符串。 返回值: 如果找到str2在str1中的第一次出现的位置,则返回指向该位置的指针。 如果没有找到str2,则返回NULL指针。 函数功能: strstr函数的作用是在str1中查找第一次出现的str2,并返回指向该位置的指针。它只能用于搜索字符串,不能用于搜索单个字符。 使用示例: ```c #include <stdio.h> #include <string.h> int main() { char str1[20] = "Hello, world!"; char str2[7] = "world"; char *result; result = strstr(str1, str2); if (result != NULL) { printf("找到了目标字符串:%s\n", result); } else { printf("未找到目标字符串。\n"); } return 0; } ``` 在上面的示例中,我们定义了两个字符串str1和str2,然后使用strstr函数在str1中搜索str2。最后根据返回值判断是否找到了目标字符串。 需要注意的是,strstr函数是区分大小写的,如果要进行大小写不敏感的搜索,可以使用其他函数,比如strcasestr。此外,如果要查找的目标字符串是空字符串,strstr函数会直接返回str1的指针,而不是NULL。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值