字符串常见库函数实现

strcpy 
函数原型:char* _strcpy(char* dest,char* src) 
函数功能:将str所指由nullptr的字符串复制到dst所指的数组中,并返回dest的指针。 
函数说明:保证src和dest所指内存区域不能重叠且dest必须有足够的空间来容纳src的字符串。 
函数实现

char* _strcpy(char* dest, const char* src)
{
    assert(dest != nullptr&&src != nullptr);
    //判断dest指针和src指针是否为空,若为空抛出异常
    char* tmp = dest;
    while (*tmp++ = *src++)
        ;
    return dest;
}

strncpy

函数原型:char* _strncpy(char* dest,const char* src,size_t n) 
函数功能:把src所指由nullptr结尾的字符串前n个字节复制到dest所指的数组中。 
函数说明:如果src的前n个字节不含nullptr,则结果不会以nullptr结束;如果src的的长度小于n个字节,则以nullptr填充dest直到复制完n个字节;保证src和dest所指内存区域不能重叠且dest必须有足够的空间来容纳src的字符串。 
函数实现

char* _strncpy(char* dest, const char* src, int n)
{
    assert(dest != nullptr&&src != nullptr);
    //判断dest指针和src指针是否为空,若为空抛出异常
    int i = 0;
    char* tmp = dest;
    while (i++ < n && (*tmp++ = *src++))
        ;
    while (i++ < n)
        *tmp++ = '\0';
    return dest;
}

strcat 
函数原型:char* _strcat(char *dest, const char *src) 
函数功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的’\0’)并添加’\0’。 
函数说明:保证src和dest所指内存区域不能重叠且dest必须有足够的空间来容纳src的字符串。 
函数实现

char* _strcat(char* dest, const char* src)
{
    assert(dest != nullptr&&src != nullptr);
    //判断dest指针和src指针是否为空,若为空抛出异常
    char* tmp = dest;
    while (*tmp)//若为while(*dest++)则会跳过dest中的'\0'导致无法连接
        tmp++;
    while (*tmp++ = *src++)
        ;
    return dest;
}

strncat 
函数原型:char* _strncat(char* dest, const char* src,size_t n) 
函数功能:把src所指字符串的前n个字符添加到dest结尾处(覆盖dest结尾处的’\0’)并添加’\0’。 
函数说明:保证src和dest所指内存区域不能重叠且dest必须有足够的空间来容纳src的字符串。 
函数实现

char* _strncat(char* dest, const char* src, size_t n)
{
    assert(dest != nullptr&&src != nullptr);
    //判断dest指针和src指针是否为空,若为空抛出异常
    char* tmp = dest;
    while (*tmp)//若为while(*dest++)则会跳过dest中的'\0'导致无法连接
        tmp++;

    while (n--)
    {
        if (!(*tmp++ = *src++))//保证当src的长度小于n时,此时tmp已有'\0'
            return dest;
    }

    *tmp = '\0';//对于src长度大于n时,加上字符串结尾
    return dest;
}

strlen 
函数原型:size_t _strlen(const char* str) 
函数功能:计算字符串str的长度。 
函数说明:返回s的长度,不包括结束符NULL。 
函数实现

//常规写法
size_t _strlen(const char* str)
{
    assert(str);
    const char* eofStr = str;
    while (*eofStr++)
        ;
    return (eofStr - str - 1);
}
//递归写法,不借助变量(面试题要求)
size_t _strlen_R(const char* str)
{
    /*if ('\0' == str)
        return 0;

    return _strlen_R(str + 1) + 1;*/

    return *str ? _strlen_R(str + 1) + 1 : 0;//更为简洁
}

strcmp 
函数原型:int _strcmp(const char* dest, const char* src) 
函数功能:比较字符串dest和src。 
函数说明: 
当dest< src时,返回值 < 0 
当dest= src时,返回值 = 0 
当dest> src时,返回值 > 0 
函数实现

int _strcmp(const char* dest, const char* src)
{
    assert(dest != nullptr&&src != nullptr);
    //判断dest指针和src指针是否为空,若为空抛出异常
    while (*dest&&*src && (*dest == *src))
    {
        dest++;
        src++;
    }
    return (*dest - *src);
}

strncmp 
函数原型:int _strncmp(const char* dest, const char* src, size_t n) 
函数功能:比较字符串dest和src的前n个字符。 
函数说明: 如果前n字节完全相等,返回值就为0;在前n字节比较过程中,如果出现dest[n]与src[n]不等,则返回(dest[n]-src[n])。 
函数实现

int _strncmp(const char* dest, const char* src, size_t n)
{
    assert(dest != nullptr&&src != nullptr);
    //判断dest指针和src指针是否为空,若为空抛出异常
    if (!n)//若n为0,则返回0;
        return 0;
    while (n--&&*dest&&*src && (*dest == *src))
    {
        dest++;
        src++;
    }

    return (*dest - *src);
}

strstr 
函数原型: 
函数功能:找出src字符串在dest字符串中第一次出现的位置(不包括src的’\0’) 
函数说明:返回该位置的指针,如找不到,返回空指针。 
函数实现

char* _strstr(const char* dest, const char* src)
{
    assert(dest != nullptr);
    //判断dest指针是否为空,若为空抛出异常
    if (!src)
        return (char*)dest;

    while (*dest)
    {
        const char* destTmp = dest;
        const char* srcTmp = src;
        while (*srcTmp == *destTmp && (*srcTmp))//限时*srcTmp与*destTmp比较后相等至'\0'时继续访问出现越界
        {
            srcTmp++;
            destTmp++;
        }
        if (!(*srcTmp))
            return (char*)destTmp;

        dest++;
    }
    return nullptr;
}

void *memset(void *dest, int c, size_t count);  
将dest前面count个字符置为字符c.  返回dest的值. 

void memset(void *s,int c,size_t n) //将已开辟内存空间s的首n个字节的值设为c
{
    assert(s!=NULL);
    char *tmp=(char *)s;
    while(n--)
    {
        *tmp++=(char)c;
    }
    return s;
}

void *memcpy(void *dest, const void *src, size_t count);  
从src复制count字节的字符到dest. 与memmove功能一样, 只是不能处理src和dest出现重叠.  返回dest的值. 


void memcpy(void *dest,const void *src,size_t n)//从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中
{
    assert(dest!=NULL&&src!=NULL);
    char *tmpdest=(char *)dest;
    char *tmpsrc=(char *)src;
    while(n-- >0)
        *tmpdest++=*tmpsrc++;
    return dest;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值