//因此在处理字符串时,要么把它当作数组,把参数作为下标,要么就把它当作指针,移动指针实现自增,指针加减实现返回值。
![](https://i-blog.csdnimg.cn/blog_migrate/17a5e7e1044864390cad25ace16b44d0.png)
strcmp比较字符串大小
int strcmp(const char *s1,const char *s2);
用来比较两个字符串,返回值有三种情况
怎么定义相等/大/小
字符串是不能直接比较大小的
printf("%d\n",s1==s2);
//当然不行,要知道,放在格式化输出符后面比较数组,
//实质是比较两个数组的地址是否相同。而两个数组的地址一定是不相同的。
实质上是在比较地址
返回值:0 1 -1 代表?
0:两字符串相等,s1==s2
if( strcmp(s1,s2) )//不行
{ }
——————————————————————————
if( strcmp(s1,s2)==0 )
{ }
1:前者较大,s1>s2
char s1[] = "abc";
char s2[] = "Abc";
printf("%d\n",strcmp(s1,s2));
//结果为32
//比较结果为32,表示前者大于后者。也就是a比A大32,ASCII码 'a'-'A'=32。对应正确。
//a的ASCII码值比A大
-1:后者较大,s1<s2
char s1[] = "abc";
char s2[] = "bbc";
printf("%d\n",strcmp(s1,s2));
//结果为-1
char s1[] = "abc";
char s2[] = "abc ";//(多一个空格)
printf("%d\n",strcmp(s1,s2));
//比较结果为-32,表示后者大于前者。
strcmp函数实质
从第一个元素开始判断,不相等就输出大于小于(第n个元素ASCII码相减),一直相等到最后才输出相等0
将两个数组中第n个元素ASCII码相减(第一个数组减第二个数组),返回结果。
![](https://i-blog.csdnimg.cn/blog_migrate/803a2da2eae87cadcf76374fa3b683c5.png)
自己函数strcmp
//用数组的方式:
int mycmp(const char* s1,const char* s2)
{
int idx = 0;
//当比较的元素不相等,且s1没结束,就不退出循环,将之前的条件反过来并且合并
while( s1[idx] == s2[idx] && s1[idx] != '\0')
{
idx++;
}
return s1[idx] - s2[idx];
}
//用指针的方式:——————————————————————————————————————————————————————
int mycmp(const char* s1,const char* s2)
{
//条件是一样的,舍弃掉额外变量之后,需要用指针来控制遍历和比较。
//而且传进来的就是指针,可以直接用
while( *s1 == *s2 && *s1 != '\0')
{
s1++;
s2++;
}
return *s1 - *s2;
}
//因此在处理字符串时,要么把它当作数组,把参数作为下标,要么就把它当作指针,移动指针实现自增,指针加减实现返回值。
strcpy复制一个字符串
char* strcpy(char *resitrict dst, const char *restrict src);
把第二个参数src表达的那个字符串拷贝到第一个参数所表达的那个空间里面去
(不管它空间里面原来是是什么)
可以看到参数表里,目的地址在前而源地址在后
作用是将src的字符串拷贝到dst
restrict关键词:表示src和dst不重叠(C99)
![](https://i-blog.csdnimg.cn/blog_migrate/7763935e836a3cf04c6fc30d204edda1.png)
返回值:dst
目的:让strcpy能够再参与别的运算,链接代码
使用模板/套路:
char* dst = (char*)malloc(strlen(src)+1);
//用malloc:因为动态分配内存不清楚要复制的内容大小,用一个strlen函数获取
//+1:因为strlen得到的是内容长度,不包含结尾的0,所以再加一就可以得到正确的长度
strcpy(dst,src);
自己函数strcpy
#include<stdio.h>
#include<string.h>
//复制字符串,需要将固定位置的源地址复制到定义的位置
char* mycpy(char* dst,const char* src)
{
int idx=0;
//挨个将源地址的每个字符复制到新地址,因此当源地址的值为0时退出循环
//条件也可以写成 while(src[idx]),最后一位是0符合退出条件,自动退出
while(src[idx] != '\0')
{
dst[idx] = src[idx];
idx++;
}
//当源地址复制到最后一位就已经退出,0还没有复制过去,因此退出后再补上
dst[idx] = '\0';
return dst;
}
int main(int argc,char const *argv[])
{
char s1[] = "abc";
char s2[] = "abc";
strcpy(s1,s2);
return 0;
}
指针版(仅函数部分改动)
char* mycpy(char* dst,const char* src)
{
char* rst = *dst;
//一样,也可以写成while(*src)
//甚至再简化一下,整个循环只剩 while( *dst++ = *src++ )再加一个分号
while(*src != '\0')
{
*dst = *src;
*dst++;
*src++;
}
*dst = '\0';
//此时不能再返回dst,因为dst在过程中累加,值变化了
return rst;
}
strcat拷贝后面连接
char* strcat(char* restrict s1, const char *restrict s2);
作用:把后面的参数(source)拷贝到前面的参数(destination)后面,接成一个长的字符串
返回s1
![](https://i-blog.csdnimg.cn/blog_migrate/c50d72b49ef8b69d4924c25853c7784e.png)
cmp/cpy/cat的带n安全版本
//strcpy和strcat都有安全问题:目的地数组都可能会空间不足
//n代表了能拷贝过去的最大字符数量限制
char* strncpy(char* restrict dst, const char *restrict src,size_t n);
//n代表了能连上的最大字符数量限制
char* strncat(char* restrict s1, const char *restrict s2,size_t n);
//n可以限制比较的个数,n代表前n个
int strncmp(const char *s1,const char *s2,size_t n);
strchr字符串中找字符
char *strchr(const char*s, int c);
用来在字符串里找字符,返回一个指针 指向你找的字符(就是参数表里的c)
char *strrchr(const char *s,int c);
用来从右往左找字符(reverse)
返回NULL表示没找到
如何指向第二个”I“
//在hello中寻找l,l出现了两次,如何分别寻找第一个和第二个?
我们先寻找一下‘l’这个字符
#include<stdio.h>
#include<string.h>
int main()
{
char s[] = "hello";
char *p = strchr(s,'l');
printf("%s\n",p);
//将*p打印出来,
//结果是‘llo’,依据定义可以知道,返回的指针p指向了l,所以此时输出p会将l之后的字符打印出来
return 0;
}
因此想要查找第二个l,只需要让指针移动一位
#include<stdio.h>
#include<string.h>
int main()
{
char s[] = "hello";
char *p = strchr(s,'l');
//这里是在查找出来的llo中继续查找l,但是指定字符串为p+1,也就是在lo中查找
p = strchr(p+1,'l');
printf("%s\n",p);//此时输出的就是lo
return 0;
}
找到L并把其和后面的东西赋到另一个字符串
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc,char const *argv[])
{
char s[] = "hello";
char *p = strchr(s,'l');
//新建一个t指针,把查找到的l之后的内容赋给t
char *t = (char*)malloc(strlen(p)+1);
//从p复制到t
strcpy(t,p);
printf("%s\n",t);
free(t);
//将malloc动态分配来的指针释放,free函数包含在stdlib中
return 0;
}
找到L并把其和前面的东西赋到另一个字符串
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc,char const *argv[])
{
char s[] = "hello";
char *p = strchr(s,'l');
char c = *p;//建立一个临时变量c,指针指向了'l',赋给c,所以c='l'
*p = '\0'; //*p = '0'之后,此时s这个字符串只有he'\0',将其拷贝到t再输出t就得到he
char *t = (char*)malloc(strlen(s)+1);
strcpy(t,s);//把s【he\0】拷贝给t
*p = c;//将p还原回去,恢复字符串s,打印t
printf("%s\n",t);
free(t);
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/11683e51112b89badba8ec9dddca9871.jpeg)
strstr字符串找字符串
char *strstr(const char *s1,const char *s2);
作用是在字符串里找字符串
char *strcasestr(const char *s1,const char *s2);
和上面一样,但是忽略大小写