字符串与内存函数

strlen函数:求字符串长度

形式:size_t strlen(const char*str)

1.strlen会在遍历到'\0‘结束,故字符数组或字符串中必须有\0或定义好字符数组的长度

2.strlen返回的字符串或字符数组长度不包含\0

3.strlen返回的是无符号类型,所以不可以相减(相减后结果仍然是无符号的)

下面我们自主实现一个mystrlen函数,共有三种实现方法:

①计数器实现

size_t mystrlen(const char*str){
    assert(str!=NULL);
    int count=0;
    while(*str!='\0'){
        count++;
        str++;
    }
    return count;
}

②递归实现

size_t mystrlen(const char*str){
    if(*str=='\0')
        return 0;
    else
        return 1+mystrlen(str+1);
}

③指针实现

size_t mystrlen(const char*str){
    char*p=str;
    while(*p!='\0')
        p++;
    return p-str;
}

 

strcpy函数:字符串拷贝

形式:char*strcpy(const char*dest,char*src)

1.strcpy以\0结束,并且会将\0拷贝过去

char arr[]={'a','b','c'};//字符数组没有定义长度不会带有\0
char arr[20]={'a','b','c'};//定义字符数组长度后剩下的13个位置都自动带有\0
char arr[]={'a','b','c','\0'};//字符数组安放了\0
char arr[]="abcd";//字符串自带\0

2.目标字符串空间必须大于或等于源字符串的空间,以便有充足的空间将源字符串拷贝过去

3.目标字符串空间必须可修改(例如指针就不可修改)

char*arr1="efghijk";//常量字符串不可修改
char arr2[]="abcd";
strcpy(arr1,arr2);//不可行

下面我们定义一个mystrcpy来实现strcpy的功能:

char*mystrcpy(char*dest,const char*src){
    assert(dest&&dest!=NULL)
    while(*src!='\0'){
        *dest++=*src++;
    }
    return dest;
}

 

通过调试可知,这个代码是错误的,那么问题在哪里呢?

第一,该代码的循环在*src是\0时直接跳过,不能拷贝出\0,不符合strcpy函数的作用

第二,该代码在赋值最后一个元素后遇到\0直接结束循环,那么dest就指向最后一个元素,而我们返回的是dest的地址,要想打印出来拷贝后的字符串应将dest指向首元素。

了解这些问题后我们更改代码:

char*mystrcpy(char*dest,const char*src){
    assert(dest&&src!=NULL);
    char*ret=dest;
    while(*dest++=*src++){}
    return ret;
}

 

strcat函数:链接字符串

形式:char*strcat(const cahr*dest,char*src)

1.源字符串中必须有\0来结束,目标字符串也要有\0来说明追加位置

2.目标字符串空间必须足够大以能放下源字符串

3.目标字符串必须可修改

下面我们来写mystrcat函数来实现strcat的作用:

char*mystrcat(char*dest,char*src){
    assert(dest&&src);
    char*ret;
    while(*dest)//找目标字符串中的\0
        dest++;
    while(*dest++=*src++){;}
    return ret;
}

 

strcmp函数:字符串比较

形式:size_t strcmp(const char*s1,const char*s2)

1.strcmp比较的不是字符串长度,而是字符串中对应位置的字符串大小(ASCⅡ码值),若相同就跳过,直到遇到不同的或\0结束

2.返回值>0的数字

下面我们用mystrcmp来实现strcmp的函数作用:

int mystrcmp(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;
}

 

strstr函数:str2是否为str1的子串

形式:char*strstr(const char*str1,const char*str2)(返回str2在str1中第一次出现的位置)

下面我们写mystrstr函数来实现strstr函数的功能:

char*mystrstr(const char*str1,const char*str2){
    char*s1=str1,*s2=str2;
    char*cur=str1;
    while(*cur!='\0'){
        s1=cur;
        s2=str2;
        while(*s1&&*s2&&*s1==*s2){
            s1++;
            s2++;
        }
        if(*s2=='\0')
            return (char*)cur;
        cur++;
    }
    return NULL;
}
int main(){
    char arr1[]="abcdefghijk";
    char arr2[]="cdefg";
    char*ret=mystrstr(arr1,arr2);
    if(ret==NULL)
        printf("找不到该字符串\n");
    else
        printf("%s\n",ret);
}

 

strncpy,strncat,strncmp函数:长度受限制的字符串函数

1.char*strncpy(char*dest,const char*src,int count)

int main(){
    char arr1[]="abcdefghijk";
    char arr2[]="cdefg";
    strncpy(arr1,arr2,6);
    printf("%s",arr1);
    return 0;
}

2.char*strncat(char*dest,const char*src,size_t count)

int main(){
    char arr1[20]="abcdefg\0XXXXX";
    char arr2[]="ABXDCFG";
    strncat(arr1,arr2,3);
    printf("%s",arr1);
    return 0;
}

3.int strncmp(const char*dest,const char*srcint count)

int main(){
    char arr1[]:abcdef";
    char arr2[]="abdsdvfvd";
    int ret=strncmp(arr1,arr2,5);
    printf("%d",ret);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

妮妮妮妮没事吧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值