发布时间:2023-03-17 14:00
size_t strlen( const char *string );
1 字符串以 \0 作为结束标志,strlen函数返回的是 \0之前出现的字符个数
2 字符串必须以 \0 结束
3 返回值为 size_t ,是无符号类型
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;//返回的是目标空间的起始地址
}
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);
}
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;
}
以上函数均适用字符串长度不受限制的,以下三个函数均适用字符串长度受限制的
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
char *strncat(char *dest,const char *src,int n);
功能:把src所指字符串的前n个字符添加到dest结尾处(覆盖dest结尾处的’\0’)并添加’\0’。
int strncmp( const char *string1, const char *string2, size_t count );
功能:将两个字符串中前count个字符进行比较,string1的字符串的ascll值大,返回大于0的数,反之,返回小于0的数,相等则返回0
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;
}
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++;
}
}