赶紧来修炼内功~字符串函数详解大全(三)

目录

1. strstr

2. strtok

重点: 

 3. strerror

perror:


1. strstr

该函数是用来查找str1字符串中是否含有str2字符串

   存在:返回str2字符串所在的起始地址

不存在:返回NULL

int main()
{
	char str1[] = "abcdefabc";
	char str2[] = "fab";
	char* p = strstr(str1, str2); //strstr函数的返回值为char*类型,所以创建一个char*类型的p来 
                                  //接收地址
	printf("%s\n", p);
	return 0;
}

 如果str1字符串中含有多个str2字符串,那么返回第一次找到的str2的地址

int main()
{
	char str1[] = "cdefabcfabfabdef";//含有多个"fab"字符串
	char str2[] = "fab";
	char* p = strstr(str1, str2);
	printf("%s\n", p);
	return 0;
}

 找不到就是不存在,返回NULL

int main()
{
	char str1[] = "cdefadbc";
	char str2[] = "fab";
	char* p = strstr(str1, str2);
	if (p == NULL)
		printf("不存在\n");
	else
		printf("%s\n", p);
	return 0;
}

模拟实现:

 创建一个my_strstr函数,模拟实现strstr函数的功能:

char* my_strstr(const char* str1, const char* str2)
{ //通过4指针法实现
	assert(str1 && str2);
	char* s1 = str1;
	char* s2 = str2;
	while (*s1++ != '\0')
	{
		while (*s1 != *s2 && *s1 != '\0')
			s1++;
		str1 = s1;
		while (*s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
			return str1;
		s1 = str1;
		s2 = str2;
	}
	return NULL;
}
int main()
{
	char arr1[] = "abcdefabcab";
	char arr2[] = "fabc";
	char* p = my_strstr(arr1, arr2);
	if (p == NULL)
		printf("不存在\n");
	else
		printf("%s\n", p);

	return 0;
}

2. strtok

该函数的返回类型为char*类型,

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

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

该函数的作用是:将str所指向的字符串按分隔符分割成若干段字符串。

重点: 

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

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

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

4. 如果字符串中不存在更多的标记,则返回 NULL 指针。

int main()
{
	char* p = "shandongkejidaxue@985.com";
	const char* del = ".@";
	char arr[30];
	strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容
	char* str = strtok(arr, del);
	printf("%s\n", str);
}

以上面这段代码为例:

将p所指向的字符串拷贝到arr中,将arr传给strtok函数,再传分隔符的字符串del,这样函数就会找arr字符串中有没有del中的字符,将找到的第一个标记改为'\0',这里找到的第一个标记就是'@',并返回指向这个标记起始位置的指针,这里我们用str接收,然后以str为指针打印字符串,就得到了"shandongkejidaxue"。

此时,我们要是想继续打印接下来分割的字符串,还需要再用一次strtok函数,不过这次我们第一个参数就直接给NULL就行,因为当strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置,我们上一次用strtok函数时,他已经保存了第一个标记的位置,所以我们第二次使用strtok函数时第一个参数传NULL,这时strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记,这样一来,就可以继续分割后面的字符串了。以此类推,第三次、第四次均是如此~

int main()
{
	char* p = "shandongkejidaxue@985.com";
	const char* del = ".@";
	char arr[30];
	strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容
	char* str = strtok(arr, del);
	printf("%s\n", str);

	str = strtok(NULL, del);
	printf("%s\n", str);

	str = strtok(NULL, del);
	printf("%s\n", str);

}

当我们不知道所要分割的字符串中含有多少个分隔符时,我们可以用循环来实现 

#include <stdio.h>
int main()
{
	char* p = "shandongkejidaxue@985.com";
	const char* del = ".@";
	char arr[30];
	char* str = NULL;
	strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容
	for (str = strtok(arr, del); str != NULL; str = strtok(NULL, del))
	{//如果字符串中不存在更多的标记,则返回 NULL 指针,所以当str为NULL时就说明字符串已经分割完 
     //成了。
		printf("%s\n", str);
	}
}

 3. strerror

参数为错误码

返回值为错误码所对应的错误信息

这里的0、1、2、3、4均为错误码,一个错误码对应一个错误信息。

 那么怎么用这个函数呢?

这里举一个例子:

//errno 为C语言提供的全局的错误码变量,将错误码记录到该变量中
//头文件为 <errno.h>
#include <errno.h>
int main()
{
	//打开一个文件并读取
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)//若为NULL表示打开失败
	{
		printf("%s\n", strerror(errno));
	}
	else
	{
		//读文件
		
		//关闭文件
		fclose(pf);
		pf = NULL;
	}
	return 0;
}

 表示没有找到该文件,即该文件不存在。

perror:

这里还有一个函数与strerror函数相似:

perror                  (头文件为  <stdio.h>)

int main()
{
	//打开一个文件并读取
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)//若为NULL表示打开失败
	{
		perror("fopen");//内容可以根据需要随意更改~
	}
	else
	{
		//读文件
		
		//关闭文件
		fclose(pf);
		pf = NULL;
	}
	return 0;
}

 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒲公英的吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值