strlen(),strcpy(),strncpy(),strcat(),strncat(),strcmp(),strncmp()等函数的实现

本文介绍了C++中字符串处理函数的实现方法,包括字符串长度获取、字符串复制与连接、字符串比较等功能,并通过示例展示了这些函数的具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++提供了功能强大的字符串检测和处理函数,以下是对它们的实现(实现方式多种多样,仅实现其中一种)。

myString.h

#include "assert.h"

//返回字符串的长度
size_t strlen(const char *s)
{
    assert(s != NULL);
    size_t count = 0;
    while(s[count] != '\0')
    {
        count++;
    }
    return count;
}

//将字符串s2覆盖s1  返回s1的首地址
char * strcpy(char *s1,const char *s2)
{
    assert(s1 != NULL && s2 != NULL);
    char * str = s1;
    //拷贝s2的结尾符'\0'进入s1,故s1长度等于s2长度
    while((*s1 = *s2) != '\0')
    {
        s1++;
        s2++;
    }
    return str;
}

//如果n大于s2长度函数功能等同于strcpy();n小于s2长度,s2的前n个字符覆盖s1的前n个字符
char * strncpy(char *s1,const char *s2,size_t n)
{
    assert(s1 != NULL && s2 != NULL);
    char *str = s1;
    //n<=strlen(s2)时:不拷贝s2结尾字符'\0'到s1,故s1长度不变
    //n> strlen(s2)时:拷贝s2结尾符'\0'到s1,故s1长度为s2长度
    for(int i=0;(i<n)&&(*s1 = *s2)!='\0';i++)
    {
        s1++;
        s2++;
    }
    return str;
}

//将字符串s2添加到s1的末尾
char * strcat(char *s1,const char *s2)
{
    assert(s1 != NULL && s2 != NULL);
    char * str = s1;
    //让指针s1指向结尾字符'\0'的位置
    while(*s1 != '\0')
    {
        s1++;
    }
    //将s2的内容依次拷贝到s1的结尾
    while((*s1 = *s2)!= '\0')
    {
        s1++;
        s2++;
    }
    return str;
}

//将字符串s2复制到s1的末尾,最多复制n个字符
char * strncat(char *s1,const char *s2,size_t n)
{
    assert(s1 != NULL && s2 != NULL);
    char * str = s1;
    while(*s1 != '\0')
    {
        s1++;
    }
    //如果n<= strlen(s2):复制s2前n个字符到s1末尾
    //如果n> strlen(s2):复制s2到s1末尾
    for(size_t i = 0;(i<n)&&(*s1 = *s2)!= '\0';i++)
    {
        s1++;
        s2++;
    }
    *s1 = '\0';
    return str;
}

//比较s1,s2的大小:返回结果为正、零、负时分别代表s1>s2,s1==s2,s1<s2
int strcmp(char *s1,const char *s2)
{
    assert(s1!=NULL && s2!=NULL);
    while(*s1 == *s2 && *s1!='\0')
    {
        s1++;
        s2++;
    }
    return *s1 - *s2;
}

//比较s1,s2前n个字符的大小:返回结果为正、零、负时分别代表s1>s2,s1==s2,s1<s2
int strncmp(char *s1,const char *s2,size_t n)
{
    assert(s1!=NULL && s2!=NULL);
    for(size_t i = 0;(i<n-1) && (*s1 == *s2) && (*s1 != '\0');i++)
    {
        s1++;
        s2++;
    }
    return *s1 - *s2;
}

以下是对myString.h头文件中方法的使用

Main.cpp

#include <iostream>
#include "myString.h"

using namespace std;

int main()
{
    char s1[] = "BBBB";
    char s2[] = "AA";
    int flag = 0;

    //strlen()函数使用举例
    if(flag == 0)
    {
        cout<<"s1:"<<strlen(s1)<<"  "<<"s2:"<<strlen(s2)<<endl;
    }

    //strcpy()函数使用举例
    else if(flag == 1)
    {
        strcpy(s1,s2);
        cout<<s1<<endl;
    }

    //strncpy()函数使用举例
    else if(flag == 2)
    {
        strncpy(s1,s2,1);
        cout<<s1<<" "<<strlen(s1)<<endl;
    }

    //strcat()函数使用举例
    else if(flag == 3)
    {
        strcat(s1,s2);
        cout<<s1<<" "<<strlen(s1)<<endl;
    }

    //strncat()函数使用举例
    else if(flag == 4)
    {
        strncat(s1,s2,1);
        cout<<s1<<" "<<strlen(s1)<<endl;
    }

    //strcmp()函数使用举例
    else if(flag == 5)
    {
        cout<<strcmp(s1,s2)<<endl;
    }

    //strncmp()函数使用举例
    else if(flag == 6)
    {
        cout<<strncmp(s1,s2,2)<<endl;
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值