仿寫各種字符串操作函數

一、頭文件: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章