仿写各种字符串操作函数

来源:互联网 发布:群众网络安全保密 编辑:程序博客网 时间:2024/05/16 00:38

一、头文件:String.h

#ifdef __STRING_H__#define __STRING_H__#endifchar *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);//字符查找,有返回此字符地址,无返回NULLint   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;}
原创粉丝点击