c语言字符串函数

目录

字符串函数

 strcpy

 strcat

 字符串搜索函数

下一篇:


字符串函数

头文件string.h

这是c标准库函数,理论上所有c语言发行版本都带有的函数

1size_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,也就是s1s2不相等的差值

如果是计算差值的编译器,假如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 copyt中,但是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);//忽略大小写

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值