字符串函数和字符函数详解——strlen,strcpy,strcat,strcmp......

发布时间:2023-03-17 14:00

strlen

size_t strlen( const char *string );

1 字符串以 \0 作为结束标志,strlen函数返回的是 \0之前出现的字符个数
2 字符串必须以 \0 结束
3 返回值为 size_t ,是无符号类型

strcpy

char *strcpy( char *strDestination, const char *strSource );

1 源字符串必须以 \0结束
2 会将源字符串的 \0拷贝到源字符串
3 目标空间必须足够大且是可变的
书写函数模拟实现

#include
#include
#include
 
char *my_strcpy(char *s1,const char *s2)
{
	assert(s1!=NULL);
	assert(s2!=NULL);
	char *ret=s1;
	while(*s2!='\0')
	{
		*s1=*s2;
		s1++;
		s2++;
		
	}
	*s1=*s2;//将\0拷贝过去了 
	
	return ret;
}


int main()
{
     char a1[]="*****************";
	 char a2[]="helloworld";
	 strcpy(a1,a2);
	 printf("%s",a1); 
	 return 0;	
	
} 

assert函数是为了保障s1和s2不为空指针
最后拷贝的为符号\0
返回为目标空间的起始地址
另一种形式为

char *my_strcpy(char *s1,const char *s2)
{
    assert(s1&s1);//任意一个指针均不能为假 
    
    char *ret=s1; 
    while(*s1++=*s2++)  //拷贝字符串,包括\0 
    {
    	;
	}
   
     return ret;//返回的是目标空间的起始地址 
}

strcat-字符串追加

char *strcat( char *strDestination, const char *strSource );

1 源字符串必须以 \0结束
2 目标空间必须足够大且是可修改的
3目标字符串中的\0为新字符串添加的位置,源字符串中的\0为所要加到的位置
应用

#include
#include
int main()
{
	char a1[]="hello ";
	char a2[]="world ";
    strcat(a1,a2);
    printf("%s",a1);

}

模拟实现:先找到目标字符串的\0位置,再用strcpy函数原理将字符串追加
\0的ascll值为0,所以在判断语句中为假

#include
#include
#include

char* my_strcat(char *s1,const char *s2)
{    
    assert(s1&&s2);
	char *ret=s1;
	
	while(*s1)
{
	s1++;
}       //找到目标空间的\0 
   while(*s1++=*s2++)
   {
   	;
   }
       //追加 
   return ret;
}


int main()
{
	char a1[]="hello ";
	char a2[]="world ";
    my_strcat(a1,a2);
    printf("%s",a1);

}
    
    

strcmp

int strcmp( const char *string1, const char *string2 );

1 比较的是字符串中字母对应的ascll值
2 string1大于string2返回大于0的数,小于返回小于0的数,相等返回0
模拟实现

#include

#include

int my_strcmp(const char*s1,const char *s2)
{
	assert(s1&&s2);
	while(*s1==*s2)
	{
		if(*s1=='\0')
		return 0;
		s1++;
		s2++;
	}
	if(*s1>*s2)
	 return 1;
	else 
	 return -1;
}

int main()
{
	char s1[]="abc";
	char s2[]="jkl";
	int a=my_strcmp(s1,s2);
	printf("%d ",a);
}

另一种方式

int my_strcmp(const char*s1,const char *s2)
{
	assert(s1&&s2);
	while(*s1==*s2)
	{
		if(*s1=='\0')
		return 0;
		s1++;
		s2++;
	}
     return *s1-*s2;
}

以上函数均适用字符串长度不受限制的,以下三个函数均适用字符串长度受限制的

strncpy

char *strncpy( char *strDest, const char *strSource, size_t count );

相较于strcpy会再加上一个元素——count,即从源字符串中所要拷贝的字符串长度

#include
#include

int main()
{
	char s1[]="*******";
    char s2[]="abc";
    strncpy(s1,s2,2);
    printf("%s",s1);
 } 

输出结果为 ab*****
当count数大于源字符串长度时,会在剩余长度中添加\0

strncat

char *strncat(char *dest,const char *src,int n);

功能:把src所指字符串的前n个字符添加到dest结尾处(覆盖dest结尾处的’\0’)并添加’\0’。

strncmp

int strncmp( const char *string1, const char *string2, size_t count );

功能:将两个字符串中前count个字符进行比较,string1的字符串的ascll值大,返回大于0的数,反之,返回小于0的数,相等则返回0

strstr

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

功能:在一个字符串中查找另一个字符串的位置,返回第一个字符的位置

#include
#include

int main()
{ 
     char s1[]="abcdefbcd";
	 char s2[]="bcd";
	 char*ret=strstr(s1,s2);
	 if(ret!=NULL)
	 printf("%s",ret);
	 else 
	 printf("找不到字串");
	 
	 return 0;	
	
} 

如果找不到,则返回空指针
模拟实现

char *my_strstr(const char*s1,const char *s2)
{
	assert(s1&&s2);
	const char *cp=s1;
	
	while(*cp)
	{
		const char *p1=cp;
		const char *p2=s2;
		while((*p1)&&(*p2)&&(*p1==*p2))
		{
		    p1++;
			p2++;	
		} 
		if(*p2=='\0')
		return (char*)cp;   //返回类型强制转化为char*类型的
		
		cp++;
	}
	return NULL;
	 
}

strtok——分割字符串

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

1 第一个参数指定一个字符串,包含0个或多个sep中包含的分隔符标记
2 strtok函数找到str中的下一个标记,并将其用\0结尾,返回指向这一标记的指针
3 strtok函数的第一个参数不为NULL,函数找到str中第一个标记,函数将保存它在字符串中的位置
4 函数剩下的参数为NULL,函数将在字符串中被保存的位置开始,查找下一个标记
5 如果字符串中不存在更多的标记,则返回NULL指针

#include
#include

int main()
{
	char s1[]="sng.ndgkgn@fdgk";
	char s2[30]={0};
	strcpy(s2,s1);
    char *p="@.";
    char *ret=NULL;
	for(ret=strtok(s2,p);ret!=NULL;ret=strtok(NULL,p))
	{
           printf("%s\n",ret);		
    }	 
    return 0;
}

按照p指针中的分割符标记分割后输出为

sng
ndgkgn
fdgk

字符分类函数——判断函数

头文件为 #include

iscntrl——任何控制字符
isspace——空白字符:空格’ ‘,换页’\f’,换行’\n’,回车’\r’,制表符’\t’,垂直制表符’\v’
isdight——十进制数字0~9
islower——小写字母a~z
isupper——大写字母A~Z
isalpha——字母a到z A~Z
isalnum——字母或者数字 0~9 a~z A~Z
ispunct——标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph——任何图形字符
isprintf——任何可打印字符,包括图形字符和空白字符

判断是否为相应字符,是则返回非0的数,不是则返回0

字符大小写转化

int tolower(int c ); 大写转化为小写
int toupper(int c ); 小写转化为大写

#include

int main()
{
	char s[]="HELLO WORLD";
	int i=0;
	while(s[i])
	{
		if(isupper(s[i]))
		{
			s[i]=tolower(s[i]);
		}
		printf("%c",s[i]);
		i++;
	}

 } 

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号