天天看點

和字元串有關的函數的模拟實作 strlen strcpy strcat strstr strcmp

strlen 函數原型:
size_t  strlen(const char* string);
功能: 計算字元串長度,遇到‘/’停下;

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

//用計數器統計
int my_strlen(const char*str)
{
    assert(str != NULL);
    int count = ;
    //在遇到'/0'之前,指針向後挪動一次,count加1
    while (*str++)
    {
        count++;
    }
    return count;
}

//利用指針相減
int my_strlen(const char*str)
{
    assert(str != NULL);
    char*pc = str;
    //在遇到'/0'之前,通過指向向後挪動找到'/0',的位址
    while (*pc++)
    {
        ;
    }
    //'/0'址減去起始位址 為字元串長度
    return pc - str-;
}   

//利用遞歸的方式實作
int my_strlen(const char*str)
{
    assert(str != NULL);
    if (*str == '\0')
    {
        return ;
    }
    else
        return  + my_strlen(str + );
}  

int main()
{
    const char *p = "abcdef";
    int ret = my_strlen(p);
    printf("%d\n",ret);
    system("pause");
    return ;
}  //模拟實作strlen
           
strcpy 函數原型:
char * strcpy(char* strDestination,  const char *strSource);
功能:實作把src所指向位址空間的内容拷貝到dest指針開始指向位址空間 ,遇到'/0'結束拷貝.

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

char* my_strcpy(char* dest,const char* str)
{
    assert(str != NULL);
    assert(dest != NULL);
    char*p = str;
    while (*dest++ = *str++)
    {
        ;
    }
}

int main()
{
    const char arr1[] = "abcdef";
    char arr2[] = "aaaaaaaaaaa";
    my_strcpy(arr2, arr1);
    printf("%s\n", arr2);
    system("pause");
    return ;
}//strcay的模拟實作
           
strcat 函數原型:
char * strcat(char* strDestination,  const char *strSource);
功能:把src所指向的字元串追加到dest所指向字元串的後面;
實作:找到dest所指向字元串的’/‘的位址,将src的内容追加到後面,知道src所指向的内容指向’/‘結束;

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

char* my_strcat(char*dest,const char*str)
{
    assert(str != NULL);
    assert(dest != NULL);
    while (*dest++)
    {  
        //為了得到目标字元串的\0
        ;
    }
    //dest現在指向的是\'0'後的一個空間,-1才能得到'\0'指向的空間
    dest--;
    //把源賦給目标,為'\0'的時候跳出循環
    while(*dest++ = *str++)
    {
        ;
    }
}

int main()
{
    char arr1[] = "abcd";
    char arr2[] = "efgh";
    my_strcat(arr1, arr2);
    printf("%s\n", arr1);
    system("pause");
    return ;
}    //strcat的模拟實作
           
strstr函數原型:
      char * strstr(const char* strDestination,  const char *strSource);
功能: 在dest所指向内容裡面找子字元串src,找到傳回子字元串起始位址 ,找不到 傳回NULL;

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

int my_strstr(const char*str1, const char*str2)
{
    assert(str1 != NULL);
    assert(str2 != NULL);
    const char*s1 = str1;
    const char*s2 = str2;
    const char*p = str1;
    while (*p != '\0')
    {
         //每次循環完了之後,給s1指派p+1;保證s2和s1的第一個值進行比較
        s1 = p;
        //保證s2每次比較都是首元素開始的
        s2 = str2;
        while (*s1 == *s2)
        {
            s1++;
            s2++;
        }
        //跳出循環有兩種情況1. s2不等于s1  2. s2比較完了
        if (*s2 == '\0')
        {
            return p;
        }
        p++;
    }
    return NULL;
}

int main()
{
    const char arr1[] = "abbbcdef";
    const char arr2[] = "bcd";
    char* ret = my_strstr(arr1, arr2);
    if (ret == NULL)
    {
        printf("NO\n");
    }
    else
    {
        printf("%s\n", ret);
    }
    system("pause");
    return ;
}   //strstr 的模拟實作
           
srtcpmp函數原型:
         int  strcat(const  char* strDestination,  const char *strSource);
比較規則: 兩個字元串從左至右逐個比較,按ASC||的值比較;遇到'/0'結束;
         目标和源相等傳回;
         目标大于源傳回一個正數;
         目标小于源傳回一個負數;

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

int my_strcmp(const char*str1, const char* str2)
{
    assert(str1 != NULL);
    assert(str2 != NULL);
    const char*s1 = str1;
    const char*s2 = str2;
    //如果兩個字元串的首字元相等,判斷源是不是到'/0',如果不是繼續向後面找,如果是傳回0
    while (*s1 == *s2)
    {
        if (*s1 == '\0')
        {
            return ;
        }
        s1++;
        s2++;
    }
    //如果不相等,傳回他們相減的結果
    return *s1 - *s2;
}

int main()
{
    const char*p1 = "abcdef";
    const char*p2 = "abcdeef";
    int ret = my_strcmp(p1, p2);
    printf("%d\n", ret);
    system("pause");
    return ;
}
           

繼續閱讀