库函数的实现

本文深入探讨了C++中各种字符串操作函数的实现,包括memcpy、strcpy、strcat、strncat、strcmp、strncmp、strlen、strpbrk、strstr等,通过源代码解析帮助读者理解这些函数的工作原理。

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

库函数的实现:
memcpy函数的实现

void *memcpy(void *dest, const void *src, size_t count) {
 char *tmp = dest;
 const char *s = src;
 while (count--)
  *tmp++ = *s++;
  return dest;
}

Strcpy函数实现

char *strcpy(char *dst,const char *src) { 
      assert(dst != NULL && src != NULL); 
      char *ret = dst; 
      while((* dst++ = * src++) != '\0') ; 
      return ret; 
 }

strcat函数的实现

char *strcat(char *strDes, const char *strSrc){
	assert((strDes != NULL) && (strSrc != NULL));
	char *address = strDes;
	while (*strDes != ‘\0)
		++ strDes;
	while ((*strDes ++ = *strSrc ++) != ‘\0)
	return address;
}

strncat实现

char *strncat(char *strDes, const char *strSrc, int count){
	assert((strDes != NULL) && (strSrc != NULL));
	char *address = strDes;
	while (*strDes != ‘\0)
		++ strDes;
	while (count — && *strSrc != ‘\0)	
		*strDes ++ = *strSrc ++;
	*strDes = ‘\0;
	return address;
}

strcmp函数实现

int strcmp(const char *str1,const char *str2){

    /*不可用while(*str1++==*str2++)来比较,当不相等时仍会执行一次++,

    return返回的比较值实际上是下一个字符。应将++放到循环体中进行。*/
    while(*str1 == *str2){
        if(*str1 == '\0')
            return0;       

        ++str1;
        ++str2;
    }
    return *str1 - *str2;
}

strncmp实现

int strncmp(const char *s, const char *t, int count){
    assert((s != NULL) && (t != NULL));
    while (*s && *t && *s == *t && count –) {
        ++ s;
        ++ t;
    }
    return (*s – *t);
}

strlen函数实现

int strlen(const char *str){
    assert(str != NULL);
    int len = 0;
    while (*str ++ != ‘\0)
        ++ len;
    return len;
}

strpbrk函数实现

char * strpbrk(const char * cs,const char * ct){
    const char *sc1,*sc2;
    for( sc1 = cs; *sc1 != '\0'; ++sc1){
        for( sc2 = ct; *sc2 != '\0'; ++sc2){
            if (*sc1 == *sc2){
                return (char *) sc1;
            }
        }
    }
    return NULL;
}

strstr函数实现

char *strstr(const char *s1,const char *s2){
 int len2;
 if(!(len2=strlen(s2)))//此种情况下s2不能指向空,否则strlen无法测出长度,这条语句错误
  return(char*)s1;
 for(;*s1;++s1)
 {
     if(*s1==*s2 && strncmp(s1,s2,len2)==0)
     return(char*)s1;
 }
 return NULL;
}

string实现(注意:赋值构造,operator=是关键)

class String{
public:
	//普通构造函数
	String(const char *str = NULL);
	//拷贝构造函数
	String(const String &other);
	//赋值函数
	String & operator=(String &other) ;
	//析构函数
	~String(void);
private:
	char* m_str;
};

分别实现以上四个函数

//普通构造函数
String::String(const char* str){
    if(str==NULL) //如果str为NULL,存空字符串{
        m_str = new char[1]; //分配一个字节
        *m_str = ‘\0; //赋一个’\0′
}else{
       str = new char[strlen(str) + 1];//分配空间容纳str内容
        strcpy(m_str, str); //复制str到私有成员m_str中
    }
}

//析构函数
String::~String(){
    if(m_str!=NULL) //如果m_str不为NULL,释放堆内存{
        delete [] m_str;
        m_str = NULL;
	}
}

//拷贝构造函数
String::String(const String &other){
    m_str = new char[strlen(other.m_str)+1]; //分配空间容纳str内容
    strcpy(m_str, other.m_str); //复制other.m_str到私有成员m_str中 
} 
//赋值函数
String & String::operator=(String &other){
    if(this == &other) //若对象与other是同一个对象,直接返回本{
        return *this
}
    delete [] m_str; //否则,先释放当前对象堆内存
    m_str = new char[strlen(other.m_str)+1]; //分配空间容纳str内容
    strcpy(m_str, other.m_str); //复制other.m_str到私有成员m_str中
    return *this}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值