天天看点

和字符串有关的函数的模拟实现 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 ;
}
           

继续阅读