字符串类函数模拟实现(strlen / strcpy / strcat / strcmp / strstr / memcpy / memmove)

  字符串类型是C语言中并没有被显式定义的数据类型,字符串常以字符串常量的形式出现或存储与字符数组当中。当程序不会对字符串进行修改是可以将其定义为字符串常量(文字常量区),其他形式则均存储于字符数组(栈)或动态分配的内存(堆)中。
 1.求字符串长度(strlen)
 2.复制字符串(strcpy/strncpy)
 3.连接字符串(strcat/strncat)
 4.字符串比较(strcmp/strncmp)
 5.字符串中查找子字符串(strstr/strnstr)
 6.字符串中查找字符(strchr)
 7.内存操作(memcpy/memmove)

1.求字符串长度(strlen)

  strlen函数返回一个无符号整数,计算时遍历字符串直到遇见‘\0’.
实现方法一:计数器加加

size_t my_strlen(const char *arr)
{
    int n = 0;
    assert(arr);
    while(*arr)
    {
        n++;arr++;
    }
    return n;
}

实现方法二:递归相加

size_t my_strlen(const char *arr)//递归字符串长度
{
    if((*arr)=='\0')
        return 0;
    else
        return 1+my_strlen(arr+1);
}

实现方法三:地址相减

#0000dd >**实现方法二:递归相加**
size_t my_strlen(const char *arr)
{
    int n = 0;
    char *ret = arr;
    while(*arr)
      arr++;
    return arr-ret;
}

2.复制字符串(strcpy/strncpy)

  复制时必须保证目标字符数组空间足够容纳复制的字符串,否则会越界拷贝。

strcpy实现

char *mystrcpy(char* buf,const char* msg)
{
    char *ret = buf;//用于接收返回值
    assert(buf != NULL && msg != NULL);
    while ((*buf++ = *msg++)!='\0'); 
    return ret;
}

strncpy实现

char *mystrncpy(char* buf,const char* msg,int count)
{
    int i= 0;
    char *ret = buf;
    assert (buf != NULL && msg != NULL);
    while ((i++if (*(buf)!= '\0')
        *buf = '\0';
    return ret;
}

3.连接字符串(strcat/strncat)

  strcat函数把src所指字符串添加到dest结尾处(覆盖dest结尾处的’\0’)并添加’\0’。 src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。返回指向dest的指针。
strcat实现

char *my_srtcat(char* srt,  const char* src)
{
    char *tmp = srt;
    assert(srt&&src);
    while(*srt!='\0')
        srt++;
    while(*src!='\0')
        *srt++ = *src++;
    return tmp;
}

strncat实现

char *my_srtncat(char* srt,const char* src,int count)
{
    char *tmp = srt;
    assert(srt&&src);
    while(*srt!='\0')
        srt++;
    while((*src!='\0')&&(count--))
        *srt++ = *src++;
    return tmp;
}

4.字符串比较(strcmp/strncmp)

strcmp实现

int my_strcmp(const char*s1,const char*s2)
{
    assert(s1&&s2);
    while(*s1 == *s2)
    {
        s1++;s2++;
        if((*s1 == '\0')&&(*s2 == '\0'))
            return 0;
    }
    if (*s1 > *s2)
        return 1;
    else
        return -1;
}

strncmp实现

int my_strncmp(const char*s1,const char*s2,int count)
{
    int i = 0;
    assert(s1&&s2);
    for(;iif(*s1 == *s2);
        if (*s1 > *s2)
            return 1;
        if (*s1 < *s2)
            return -1;
    }return 0;

5.字符串中查找子字符串(strstr/strnstr)

strstr实现

char* my_strstr(const char* dst,const char *src)
{
    assert(dst&&src);
    char *bp=dst;
    char *sp=src;
    while(*dst++)
    {
        bp=dst;
        sp=src;
        while(*bp++ == *sp++)
        {
           if(*sp=='\0')
           return dst;
        }
    }
}

strnstr实现

char* my_strnstr(const char* dst,const char *src,int n)
{
   char *bp=dst;
   char *sp=src;
    while((*dst++)&&(n--))
    {
        bp=dst;
        sp=src;
        while((*bp++ == *sp++)&&(n--))
        {
           if(*sp=='\0')
           return dst;
        }
    }
}

6.字符串中查找字符(strchr)

strchr实现

char* my_strchr(char* dst,char src)
{
    while(*dst++)
    {
        if((*dst)==src)
           return dst;
    }
    return NULL;

7.内存操作(memcpy/memmove)

详细函数实现与解析见:memcpy / memmove模拟实现

  以上内容均为学习总结所用,如有不足或问题欢迎批评指正。

你可能感兴趣的:(字符串类函数模拟实现(strlen / strcpy / strcat / strcmp / strstr / memcpy / memmove))