目录
下一篇:
字符串函数
头文件string.h
这是c标准库函数,理论上所有c语言发行版本都带有的函数
1、size_t strlen(const char *s);//回顾:不希望函数修改这个数组要加const
返回s的字符串长度(不包括结尾的0)
char line[]="Hello";
printf("strlen=%lu\n",strlen(line));
printf("sizeof=%lu\n",sizeof(line));
return 0;
sizeof多算一个'\0'
自己实现一个这样的函数
int mylen(const char* s)
{
int cnt;
int i=0;
while(s[i] != 0){
i++;
}
return i;
}
2、strcmp
int strcmp(const char *1,const char *s2)
比较两个字符串,返回:
0:s1==s2
1:s1>s2
-1:s1<s2
char s1[]="abc";
char s2[]="abc";
printf("%d\n",strcmp(s1,s2));
printf("%d\n",s1==s2);//数组的比较永远是false,实际上比的是地址
char s1[]="abc";
char s2[]="bbc";
printf("%d\n",strcmp(s1,s2));//b在字母表的后面比a要大
char s1[]="abc";
char s2[]="Abc";
printf("%d\n",strcmp(s1,s2));//有的编译器会出现32=a-A,也就是s1与s2不相等的差值
如果是计算差值的编译器,假如s2只多一个空格则会出现空格的ASCII码的空格数值32
例如linux的gcc
这个函数其实是逐个字符比较,第一个一样就比第二个依次类推,直到遇到大小不一致的
vs只有0,1,-1这三种结果
自己写一个
int mycmp(const char *s1,const char *s2){
while (*s1 == *s2 && *s1 != '\0'){
s1++;
s2++;
}
return *s1-*s2;
}
strcpy
strcpy
char *strcpy(char *restrict dst,const char *restrict src);
把src的字符拷贝到dst,通俗点就是把第二个参数的字符串拷贝到第一个参数的空间里面去
restrict表名src和dst不重叠(c99)
什么叫重叠?
就是将字符串a复制到b只是把a向前移动了或者向后移动了,就是重叠
这个时候不能用这个函数做拷贝
这个函数很复杂,被运用了很多次,做了很多优化
其中一个优化是当计算机是多核的时候,将拷贝工作分为好几段
这种时候必须要求不重叠,不然就有冲突
返回dst,用这种方式
为了能链起代码来
复制一个字符串
常用strcpy去复制一个字符串
char *dst=(char*)malloc(strlen(src)+1);//申请空间,为什么要+1?因为strlen取得的长度不包含'\0'
strcpy(dst,src);//复制过来
自己实现一个strcpy
char* mycpy(char *dst,const char *src)
{
int idx=0;
//数组写法
/* while (src[idx]){//!='\0',这个!=0可以省略,因为到最后'\0'就是0
dst[idx]=src[idx];
idx++;
}*/
//指针写法
char *ret=dst;
while (*src!='\0'){
/* *dst=*src;
dst++;
src++;*/
//简写
*dst++=*src++;//这里是个赋值语句结果就是src,所以可以将这条语句直接写入循环
/*while (*dst++=*src++)是等价的*/
}
//注意那个'\0'还没写进去,无论是数组写法还是指针写法都要加
dst[idx]='\0';
// return dst;数组写法可以return
//指针写法不能return dst了,因为dst被我们++到了数组尾部
return ret;//ret就是指向dst数组的头部
}
strcat
char *strcat(char *restrict s1,const char *restrict s2);
把s2拷贝到s1的后面,接成一个长的字符串
返回s1
复制从第一个字符串的'\0'开始
s1必须有足够的空间
安全问题:strcpy和strcat都可能出现安全问题,如果目的地没有足够的空间
有安全的版本,多了个参数n,n告诉函数最多可以复制多少个字符,多了掐掉
strncmp,这个函数带n并不是为了安全而是选择比较字符串的前几位,例如:字符串abcde,n=3,则只比较到abc其他的不在乎
字符串搜索函数
char *strchr(const char *s,int c);//从字符串中找字符,找c第一次出现的位置,从左边开始数
char *strrchr(const char *s,int c);//从右边找
返回NULL表示没有找到
返回的是指针指向你要找的那个字符
如何找第二个?
char s[]="hello";
char *p= strchr(s,'l');
printf("%s\n",p);//输出llo表示是返回了一个指向l的指针
//假如我们需要第一个l后面的字符串
char *t=(char*)malloc(strlen(p)+1);
strcpy(t,p);
printf("%s\n",t);
//假如我们要l前面的呢
char c=*p;//使用一个临时变量存*p
*p='\0';//将p当前的位置定为结束符
strcpy(t,s);//将s copy到t中,但是s字符串中p的位置变成了结束符所以只复制到了l之前
printf("%s\n",t);
//现在来打印一下s
printf("%s\n",s);//he,发现s只有he了
printf("%s##\n",s+4);//打印出来了o##说明实际上s还是存这整个hello,只是第一个l改成了结束符'\0'
//将s还原
*p=c;//将p所指的位置的结束符替换回来
printf("%s\n",s);//hello s就还原了
//取第二个l
p=strchr(p+1,'l');
printf("%s\n",p);
printf("%s\n",++p);//用++p去访问o
//别忘了释放资源
free(t);
从字符串中找字符串
char * strstr(const char *s1,const char *s2);//从字符串中找字符串
char * strcasestr(const char *s1,const char *s2);//忽略大小写