C语言中有关字符串的库函数(3)

本篇主要介绍3个库函数

一、strstr字符串查找

二、strtok字符串切割

三、strerror返回错误码,打印错误类型

四、perror(和strerror功能类似)

strstr

1.1        strstr---查找字符串函数   (在一个字符串里面查找是否包含另一个字符串)

             存在返回第一次出现的地址,不存在返回空指针  

1.2        char*   strstr   (const   char*   ,   const   char* ) ;

1.3        strstr 的使用

int main()
{
	char arr1[] = "abbcdef";
	char arr2[] = "bbc";
	char* ret = strstr(arr1, arr2);
	if (NULL == ret)
	{
		printf("找不到\n");
	}
	else
	{
		printf("%s\n", ret);
	}
	return 0;
}

 

 1.4        实现my_strstr

char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);//断言
	//先创建变量
	const char* s1 = NULL;
	const char* s2 = NULL;
	const char* cp = str1;//创建变量cp,方便回头查找
	//那如果查找的是空字符串怎么办,考虑全
	if (*s2 == '\0')
	{
		return (char*)str1;
	}
	//开始查找
	while (*cp)
	{
		//赋值
		s1 = cp;//都指向第一个字符
		s2 = str2;
		while (*s1 && *s2 && (*s1 == *s2))//查找进入的条件是两个字符都不是'\0'
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return (char*)cp;
		}
		cp++;//如果没找到,则返回str1的下一个字符继续查找
		//写完之后还要再修改一下,为了更加优化
		//都找完了还没有找到,要返回空指针
	}
	return NULL;
}

在查找字符串的时候,我们可能会碰到"abbbcdef","bbc"  这种情况,隐含了"bbc",所以在查找字符串的时候,需要代码能够实现回头查找的功能(上述代码),cp的存在就是实现回头查找的功能

strtok

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

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

              3)strtok的使用共有( n + 1 )次调用,第一次调用传参为 :临时拷贝字符串,分隔符标记的字符集合(sep);随后n次调用传参为:NULL,分隔符标志的字符集合(sep)

              4)strtok函数在第一次调用的时候,找到str中第一个标记,保存它在字符串中的位置,在以后n次调用中,strtok函数将在同一个字符串中被保存的位置开始查找下一个标记,如果找不到,返回NULL(为什么以后n次传参为空指针,因为已经返回指向这个标记的地址了)

               5)strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容,并且要可修改

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

2.3        strtok的使用

int main()
{
	char arr[] = "I love china !";
	char* p = " ";//空格为分割标志
	char tmp[30] = { 0 };
	strcpy(tmp, arr);//拷贝一份,用它来分割
	char* ret = NULL;
	//写成循环形式来实现自己的结束
	for (ret = strtok(tmp, p); ret != NULL; ret = strtok(NULL, p))
	{
		printf("%s\n", ret);
	}
	return 0;
}

 

 strerror

3.1        在调用库函数失败时,都会设置错误码(C语言设置好的),strerror会返回错误码所对应的错误信息

头文件为#include   <errno.h>#include   <string.h>

int main()
{
	printf("%s\n", strerror(0));
	printf("%s\n", strerror(1));
	printf("%s\n", strerror(2));
	printf("%s\n", strerror(3));
	printf("%s\n", strerror(4));
	printf("%s\n", strerror(5));
	printf("%s\n", strerror(6));
	printf("%s\n", strerror(7));
	printf("%s\n", strerror(8));
	printf("%s\n", strerror(9));
	printf("%s\n", strerror(10));
	return 0;
}

 

3.2        strerror的使用


int main()
{
	//打开文件失败的时候,返回NULL
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//读文件
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

 3.3        perror

头文件为#include   <stdio.h>

int main()
{
	//打开文件失败的时候,返回NULL
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读文件
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

 

 1.首先把错误码转化为错误信息

 2.打印错误信息(包含了自定义的信息)

对比strerror:

strerror是把错误码转化为错误信息,要打印需加上printf打印,而perror自带打印,且包含自定义信息

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值