C语言_0318笔记_字符串函数:#include<string.h>:strcmp比较大小/strcpy复制/strcat连接/strchr查找

//因此在处理字符串时,要么把它当作数组,把参数作为下标,要么就把它当作指针,移动指针实现自增,指针加减实现返回值。

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码相减(第一个数组减第二个数组),返回结果。

自己函数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)

  • 返回值: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

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;
}

strstr字符串找字符串

  • char *strstr(const char *s1,const char *s2);

  • 作用是在字符串里找字符串

  • char *strcasestr(const char *s1,const char *s2);

  • 和上面一样,但是忽略大小写

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值