Bootstrap

c语言字符串函数strstr,strtok,strerror

1,strtok函数的使用和模拟实现

char * strtok(char * str,const char * sep)(分隔字符串的作用)

会有static修饰变量,有记忆功能,会保存字符串的位置,下次找再继续找。

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

2)第一个参数指定一个字符串,并将其用\0结尾,返回一个指向这个标记的指针。

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

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

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

strtok函数和strcpy的使用

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[]="[email protected]";
	char arr2[]={0};
	strcpy(arr2,arr1);//将arr1拷贝到arr2里面 
	char *sep="@.";//设置分隔符 
	char *ret=NULL;//初始化
	//for循环对字符串分隔 
	for(ret=strtok(arr2,sep);ret!=NULL;ret=strtok(NULL,sep))
	{
		printf("%s\n",ret);//换行打印出分隔开后的字符串 
	}
	return 0;
 } 

2,strstr的使用和模拟实现

const char * strstr (const char * str1,const char * str2);

功能:在str1中找到了str2这个字符串,第一次出现的位置如果找不到了,就返回第一次出现的起始地址后面的字符也会接着运行出来,如果找不到,就返回NULL。

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[]="abcdefg";
	char arr2[]="abc";//初始化 
	char *ret=strstr(arr1,arr2);//调用函数 
	if(ret==NULL)//进行判断 
	{
		printf("不存在\n"); 
	}
	else
	{
		printf("%s\n",ret);//打印出第一个所在的起始位置 
	}
	return 0;
 } 

strstr的模拟实现

#include<stdio.h>
#include<assert.h>
const char * my_strstr(const char* str1,const char* str2)
{
	assert(str1&&str2);
	const char* s1=NULL;
	const char* s2=NULL;
	const char* cur=str1;
	if(*str2=='\0')
	{
		return str1;//如果str2是一个空字符串,返回str1 
	}
	while(*cur!='\0')
	{
		s1=cur;
		s2=str2;
		while(*s1==*s2&&s1&&s2)
		{
			s1++;//判断的字符相同则s1,s2,都进行++ 
			s2++;
		}
		if(*s2=='\0')//若是s2为\0则返回cur 
		{
			return cur;
		}
		cur++;
	}
 } 
int main()
{
	char arr1[]="abcdefg";
	char arr2[]="cde";//初始化 
	const char* ret=my_strstr(arr1,arr2);
	if(ret==NULL)//进行判断 
	{
		printf("不存在\n");
	}
	else
	{
		printf("%s\n",ret);//打印出第一个所出现的起始位置 
	}
	return 0;
}

3,strerror的使用和模拟实现

sterror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。

一般是放在errno.h这个头文件中说明的,c语言程序启动的时候就会使用一个全局变量error来记录程序的当前错误码,只不过程序启动的时候errno是0,表示没有错误,当我们使用标准库中的函数发生了某种错误,就将会对应的错误码,存放在erron中,strerror函数就可以将错误对应的错误信息字符串的地址返回。

#include<stdio.h>
#include<string.h>
int main()
{
	int i=0;
	for(i=0;i<10;i++)
	{
		pritnf("%s\n",strerror(i));
	 } 
	return 0;
 } 

#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
	//打开文件
	//用r方式打开,表示’读‘以读文件的形式 
	//打开文件,如果文件不存在,就打开失败
	FILE*pf=fopen("data.txt","r");
	if(pf==NULL)
	{
		printf("打开文件失败\n");
	 } 
	 else
	 {
	 	printf("打开文件成功\n");
	 	fclose(pf);
	 	pf=NULL;
	 }
	return 0;
}

有一个与之相似用法的函数

4,perror

sterror--将错误码对应的错误信息的字符串的起始地址返回

perror--将erron中错误对用的错误信息打印出来

perror打印方式:

函数先打印str指向的字符串,打印:,在打印一个空格,在打印错误码的错误信息。

例如:

#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
	//打开文件
	//用r方式打开,表示’读‘以读文件的形式 
	//打开文件,如果文件不存在,就打开失败
	FILE*pf=fopen("data.txt","r");
	if(pf==NULL)
	{
		printf("打开文件失败,原因是:%s\n",strerror(erron));
		perror("打开文件失败,原因是"); 
	 } 
	 else
	 {
	 	printf("打开文件成功\n");
	 	fclose(pf);
	 	pf=NULL;
	 }
	return 0;
}

就自动补齐冒号和空格,还有错误的原因

//perror也相当于printf+sterror。

;