仿写各种字符串操作函数

一、头文件:String.h

#ifdef __STRING_H__

#define __STRING_H__

#endif

char *my_strcpy(char*arr,const char*arr1);//字符串复制
char *my_strcat(char*arr,const char*arr1);//字符串拼接
char *my_strstr(const char*arr,const char*arr1);//子串查找,有返回查找的字串到结束
const char *my_strchr(const char*arr,const char arr1);//字符查找,有返回此字符地址,无返回NULL
int   my_strcmp(const char*arr,const char*arr1);//字符串比较
char *my_memcpy(void *arr,void *arr1,int count);//字符串复制,内存复制
char *my_memmove(void *arr,void *arr1,int count);//字符串复制,内存复制,避免内存重叠

二、实现函数:String.c

#include<stdio.h>
#include<assert.h>

char *my_strcpy(char*arr,const char*arr1)//字符串复制
{
    char *str=arr;//返回地址,便于链式反应
    assert(arr);
    assert(arr1);
    while(*arr++ = *arr1++);//将'\0'也要复制
    return str;
}

char *my_strcat(char*arr,const char*arr1)//字符串拼接
{
    char *str=arr;
    assert(arr);
    assert(arr1);

    while(*arr++);
    arr--;//跳出上一个循环时,已指向'\0'的下一个地址
    while(*arr++ = *arr1++);//覆盖掉原有'\0',将arr1全接在arr后
    return str;
}

char *my_strstr( char*arr,const char*arr1)//子串查找
{
    assert(arr);
    assert(arr1);

    if(*arr1=='\0')//arr1只有一个'\0','\0'不比较
    return NULL;

    while(*arr)
    {
        //q从第一个字符开始比较,连续相同至'\0'则找到,否则q重新开始,p从当前位置继续比较
        const char *p=arr;//保存当前arr的位置
        const char *q=arr1;//arr1从第一个字符开始
        while(*q)
        {
            if(*p&&*p==*q)//判断是否相同,且不为'\0'
            {
                q++;
                p++;
            }
            else//不同退出q重新开始,或结束
                break;
        }
        if(*q=='\0')//找到结束
        {
           return arr;
        }
        else//未结束,arr进行下个字符比较,arr1重新开始
        arr++;
    }//遍历至arr的'\0'则未找到
    return NULL;
}

int   my_strcmp(const char*arr,const char*arr1)//字符串比较
{
    assert(arr);
    assert(arr);

    while(*arr&&arr1)//都不为'\0'
    {
        if(*arr>*arr1)
            return 1;
        else if(*arr<*arr1)
        {
            return -1;
        }
        arr++;arr1++;
    }

    if(*arr==0 && *arr1==0)//都比较结束,相等
        return 0;
    if(*arr)//arr长则大
        return 1;
    else //否则小
        return -1;
}

const char* my_strchr(const char*arr, const char arr1)//字符查找
{
    assert(arr);
    assert(arr1);
    while(*arr){
        if(*arr == arr1)
            return arr;
        arr++;
    }
    return NULL;
}

char *my_memcpy(void *arr,void *arr1,int count)//字符串复制,内存复制
{
    void* str = arr;//保留起始地址
    assert(arr);
    assert(arr1);

    while(count--)
    {
        *(char*)arr = *(char*)arr1;
        arr=(char*)arr+1;
        arr1=(char*)arr1+1;
    }//跳出时指向复制字符串的下一个字符
    return (char*)str;//输出复制后的结果
}


char *my_memmove(void *arr,void *arr1,int count)//字符串复制,内存复制,避免内存重叠
{
    void *str=arr;
    assert(arr);
    assert(arr1);

    if(arr<=arr1||(char*)arr>=((char*)arr1+count))//arr在arr1之前或arr在arr1+count之后,直接复制
    {
        while(count--)
        {
        *(char*)arr=*(char*)arr1;
        arr=(char*)arr+1;
        arr1=(char*)arr1+1;
        }
    }
    else//后往前复制,有内存重叠
    {
        arr=(char*)+count;
        arr1=(char*)+count;
        while(count--)
        {
         *(char*)arr=*(char*)arr1;
         arr=(char*)arr-1;
         arr1=(char*)arr1-1;
        }
    }
       return (char*)str;
}

三、使用函数:main.c

#include<stdio.h>
#include<stdlib.h>
#include"String.h"

int main()
{
    char arr[20]="abc123";
    char arr1[]="456def";

    //my_strcpy(arr,arr1);
    printf("%s \n",arr);

    my_strcat(arr,arr1);
    printf("%s \n",arr);

    printf("%s \n",my_strstr(arr,"56"));

    printf("%d \n",my_strcmp(arr,arr1));

    printf("%s\n",arr);
    printf("%p \n",strchr(arr,'2'));
    printf("%p \n",my_strchr(arr,'2'));

    printf("%s\n",arr);
    printf("%s\n", my_memcpy(arr, "987", 4));
    printf("%s \n",my_memmove(arr,"456",3));
    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值