字符串函数。

    今天我学习了一些字符串函数,希望和大家分享一下。

1.strlen:求字符串的长度。

(1)正常方法。
#include<stdio.h>
#include<assert.h>
#include<Windows.h>
int my_strlen(char *str1)          //定义一个求字符串长度的函数。
{
	int n=0; 
	assert(str1);                 //断言str1不为0。 
	while(*str1!='\0')
	{
		n++;                      //循环字符串计数,直到'\0'退出循环,得到长度。
		str1++;
	}
	return n;
}
int main()
{
	char str1[]="I am a college student";    
	printf("%d\n",my_strlen(str1));     
	system("pause");
	return 0;
}

(2)递归法
#include<stdio.h>
#include<Windows.h>
int my_strlen(char *str1)          //定义一个求字符串长度的函数。
{
	if(*str1=='\0')                //用递归的方法求长度。
	{
		return 0;
	}
	return my_strlen(str1+1)+1;
	
}
int main()
{
	char str1[]="I am a college student";    
	printf("%d\n",my_strlen(str1));     
	system("pause");
	return 0;
}

注意;字符串已经'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数。函数的返回值是无符号的。

2.strcat:拼接函数。

#include<stdio.h>
#include<assert.h>
#include<Windows.h>
char *my_strcat(char *str1,char *str2)               //定义一个拼接函数。
{
	char *ret=str1;                                 //定义一个指针变量指向str1.
	assert(str1);
	assert(str2);                                   //断言两个参数不为空。
	while(*str1)
	{
		str1++;
	}                                               //循环str1直到\0。
	while(*str1=*str2)                              //此时开始拷贝。
	{
		str1++;
		str2++;}
	return ret;
}
int main()
{
	char str1[20]="abcdef";
	char str2[20]="123456";
	my_strcat(str1,str2);
	printf("%s\n",str1);                            //得到str2拼接到str1里的字符串。
	system("pause");
	return 0;
}

注意:源字符串必须以'\0'结束。目标空间必须足够大,能容下源字符串的内容。目标空间可以修改。同时,字符串不可以给自己追加,这样会造成死循环。

3.strcpy:拷贝函数。

#include<stdio.h>
#include<assert.h>
#include<Windows.h>
char *my_strcpy(char *str1,const char *str2)            //定义一个拷贝函数。
{
	char *ret=str1;                                //定义一个指针变量指向str1.
	assert(str1);                                     //断言两个参数不为空。
	assert(str2);
	while((*str1=*str2))                            //循环将str2复制到str1里去。
	{
		str1++;
		str2++;
	}
	return ret;
}
int main()
{
	char str1[10];
	char str2[10]="abcdef";
	my_strcpy(str1,str2);
	printf("str1=%s\n",str1);                       //得到复制后的str1.
	system("pause");
	return 0;
}

注意:会将源字符串中的'\0'拷贝到目标空间。目标空间必须足够大,必须可变。



4.strcmp:比较函数。

#include<stdio.h>
#include<assert.h>
#include<Windows.h>
int my_strcmp(char *str1,const char *str2)        //定义一个比较函数。
{
	int ret=0;                                    
	assert(str1);                                 //断言两个数组不为空。 
	assert(str2);
	while(!(ret=*(unsigned char *)str1-*(unsigned char *)str2) && *str2)
	{
		++str1;++str2;                           //分别比较两个数组中每一个元素的大小。
	}
		if(ret<0)
		{                                        //如果str1小于str2则输出-1.
			ret=-1;
		}
		else if(ret>0)                           //如果str1大于str2输出1.
		{
			ret=1;
		}
		else                                    //如果相等输出0.
		{
			ret=0;
		}
		return (ret);
}
int main()
{
	char str1[]="abdufgh";
	char str2[]="abdefgh";
	printf("%d\n",my_strcmp(str1,str2));       //得到结果。
	system("pause");
	return 0;
}
5.strncpy:拷贝n个字符。
#include<stdio.h>
#include<assert.h>
#include<Windows.h>
int my_strncpy(char *str1,char *str2,int size)    //定义一个拷贝size个字符到目标空间。
{                             
	assert(str1);
	assert(str2);                                 //断言str1,str2不为空,size大于0.
	assert(size>0);
	while(size--)
	{                                            //通过循环将str2赋给str1.
		
		*str1=*str2;
		str1++;
		str2++;
	}
	return 0;
}
int main()
{
	char str1[]={"He is a lucky boy!"};
	char str2[]={"It"};
	int size=2;
	my_strncpy(str1,str2,size);              //调用函数。
    printf("%s\n",str1);                     //输出结果。
	system("pause");
	return 0;
}
	
6.strncat:拼接n个字符。
#include<stdio.h>
#include<assert.h>
#include<Windows.h>
int my_strncat(char *str1,char *str2,int size)    //定义一个拼接size个字符函数。
{ 
	assert(str1);                              //断言str1,str2不为空,size大于0.
	assert(str2);
	assert(size>0);
	while(*str1)                              //循环自加str1,直到'\0'停止开始拷贝。
	{
		str1++;
	}
	while(size--)
	{                                         //拷贝str2到str1里。
		*str1=*str2;
		str1++;
		str2++;
	}
	return 0;
}
int main()
{
	char str1[80]="I am the fans of Lakers ";
	char str2[80]="because of the KOBE";
	int size=10;                            //确定拷贝的字符数。
	my_strncat(str1,str2,size);             //调用函数。
    printf("%s",str1);                      //输出结果。
	printf("\n");
	system("pause");
	return 0;
}
7.strncmp:比较n各字符的大小。
#include<stdio.h>
#include<assert.h>
#include<Windows.h>
int my_strncmp1(char *str1,char *str2,int num)              //这是不区别大小写的。
{
	assert(str1);
	assert(str2);
	assert(num>0);
	if(*str1>='A'&&*str1<='Z')
	{
		*str1=*str1+32;
	}
	if(*str2>='A'&&*str2<='Z')
	{
		*str2=*str2+32;
	}
	while((*str1==*str2) && (num--))                           
	{
		str1++;
		str2++;
	}
	return (*str1-*str2);
}
int my_strncmp(char *str1,char *str2,int num)                   //定义一个比较num个字符的大小。注:这是区别大小写的。
{
	assert(str1);                                               //断言。
	assert(str2);
	assert(num>0);
	while((*str1==*str2) && (num--))                           //当str1,str2相等并且num不为0时,继续往后比。
	{
		str1++;
		str2++;
	}
	return (*str1-*str2);                                     //不相等时用减法得到值。
}
int main()
{
	char t;
	char str1[]="He is a college student";
	char str2[]="he is a excited student";
	int num=4;
	int result1=my_strncmp(str1,str2,num);
	int result2=my_strncmp1(str1,str2,num);                   //将函数调用出来的值赋给result。
	if(result1>0)                                          //result1是区分大小写。
	{                                                      //result2是不区分大小写的。
		t='>';                                             //如果大于0,则str1大于str2.
	}
	else if(result1<0)
	{
		t='<';                                            //如果小于0,则str1小于str2.
	}
	else{
		t='=';
	}                                                    //否则两个相等。
	printf("str1  %c str2\n",t);
	if(result2>0)
	{
		t='>';                                             //如果大于0,则str1大于str2.
	}
	else if(result2<0)
	{
		t='<';                                            //如果小于0,则str1小于str2.
	}
	else{
		t='=';
	}   
	printf("str1  %c str2\n",t);
	system("pause");
	return 0;
}
8.strchr:查看子符第一次出现的位置。
#include<stdio.h>
#include<assert.h>
#include<Windows.h>
int my_strchr(char *str1, char a)                     //定义一个求一个字符在一个字符数组中第一次出现的位置的函数。
{
	char *p=str1;                                     //定义两个指针变量指向str1.
	char *q=str1;
	int n=0;                                          //位置数。
	assert(str1);                                     //断言。
	while(*p)
	{
		q=p;                                         //循环每次都要将p赋给q。
		while(*q&&*q==a)    
		{
			n++;
			return n;                                //如果q与a相等则输出n。
		}
		if(*q=='\0')
		{                                            //如果q为0输出0.
			return 0;
		}
		else{                                     //如果q与a不同,p往后走一位,n在加1,继续循环。
			p++;
			n++;
		}
	}
	return n;
}
int main ()
{
	char str1[]="abc def ghi jkl mn";
	char a='j';
	printf("first j found at position %d\n",my_strchr(str1,a));      //得到结果。
	system("pause");
	return 0;
}
9.strrchr:查找一个字符在字符串中最后一次出现的位置。
#include<stdio.h>
#include<assert.h>
#include<windows.h>
int my_strrchr(char *str1,char a)
{
	int n=0;
	int len=strlen(str1);
	char *q=&str1[len-1];
	assert(str1);
	while(*q)
	{
		if(*q==a)
		{
			
			return (len-n);
		}
		else if(*q==NULL)
		{
			return 0;
		}
		else if(*q!=a)
		{
			n++;
			q--;
		}
	}
	return 0;
}
int main()
{
	char str1[]="I am the interested people";
	char a='l';
	printf("%d\n",my_strrchr(str1,a));
	system("pause");
	return 0;
}
10.strpbrk:返回第一个字符串中第一个出现在第二个字符串中的字符的地址。
#include<stdio.h>
#include<assert.h>
#include<windows.h>
int my_strpbrk(char *str1,char *str2)                     //模拟实现strpbrk函数。
{
	char *p=str1;
	char *q=str2;
	char *m=str2;
	assert(str1);                                        //断言str1和str2不为空。
	assert(str2);
	while(*p!='\0')
	{
		while(*p!=*q && *q!='\0')                       //取str1第一个字符与str2每个字符不等继续,相等退出。
		{
			q++;
		}
		if(*p==*q && *q!='\0')                         //如果相等就输出字符。
		{
			printf("%c ",*q);
		    p++;
		    q=m;
		}
		else if(*q=='\0')                             //不等就继续比较。
		{
			p++;
			q=m;
		}
	}
	return 0;
}
int main()
{
	char str1[]="This is a simple string";
	char str2[]="aeiou";
	my_strpbrk(str1,str2);
	printf("\n");
	system("pause");
	return 0;
}

11.strstr:查看一个字符串在另一个字符串中第一次出现的位置。
#include<stdio.h>
#include<assert.h>
#include<Windows.h>
char *my_strstr(char *str1,char *str2)      //定义一个寻找子字符串的函数。
{
	char *p=str1;                         //定义指针变量指向str1和str2.
	char *q=NULL;
	char *m=str2;
	assert(str1);
	assert(str2);
	while(*p){                           //当str1不为0时进行循环。
		q=p;                             //q指向p,m指向str2.
		m=str2;
		while(*q&&*m&&(*q==*m))          //当q,m都不为空并且两个数相等时进行循环。
		{
			q++;
			m++;
		}
		if(*m=='\0')                    //如果m为0,则证明str2是str1的子字符串。
		{
			return 'Y';
		}
		else if(*q=='\0')               //如果q等于0,则不是子字符串。
		{
			return 'N';
		}
		else                           //如果q,m不相等,则p++继续往后走。
		{
			p++;
		}
	}
}
int main()
{
	char str1[10]="abcdefg";
	char str2[10]="defgh";
	printf("%c\n",my_strstr(str1,str2));      //输出结果。
	system("pause");
	return 0;
}

12.strspn:返回str1字符串中开始部分匹配str2字符串中字符的个数。
#include<stdio.h>
#include<assert.h>
#include<Windows.h>
int my_strspn(char *str1,char *str2)          //模拟实现strspn函数。
{
	int n=0;                                 //计数n。
	char *p=str1;
	char *q=str2;
	char *m=str2;                            //定义指针变量方便一个一个字符比较。
	assert(str1);
	assert(str2);                           //断言。
	while(*p) 
	{
		while((*q!='\0')&&(*p!=*q))         //当不相等时循环。
		{
			q++;
		}
		if(*p==*q)                         //相等时计数,str1网后一位,str2返回开头,再次重复操作。
		{
			n++;
			p++;
			q=m;
		}
		else if(*q=='\0')                  
		{
			p++;
			q=m;
		}
	}
	return n;
}
int main()
{
	char str1[]="129th";
	char str2[]="1234567890";
	printf("%d\n",my_strspn(str1,str2));
	system("pause");
	return 0;
}
13.strcspn:返回str1字符串中开始部分不匹配str2字符串中字符的个数。
#include<stdio.h>
#include<assert.h>
#include<Windows.h>
int my_strcspn(char *str1,char *str2)          //模拟实现strcspn函数。
{
	int n=0;                                 //计数n。
	char *p=str1;
	char *q=str2;
	char *m=str2;                            //定义指针变量方便一个一个字符比较。
	assert(str1);
	assert(str2);                           //断言。
	while(*p) 
	{
		while((*q!='\0')&&(*p!=*q))         //当不相等时循环。
		{
			q++;
		}
		if(*p==*q)                         //相等时计数,str1网后一位,str2返回开头,再次重复操作。
		{
			p++;
			q=m;
		}
		else if(*q=='\0')                  
		{
			n++;
			p++;
			q=m;
		}
	}
	return n;
}
int main()
{
	char str1[]="yuming129";
	char str2[]="1234567890";
	printf("%d\n",my_strcspn(str1,str2));
	system("pause");
	return 0;
}
这就是我总结的字符串函数,希望大家了解一下。









猜你喜欢

转载自blog.csdn.net/ymk1507050118/article/details/80436349