c++ string的一些常用函数的源码以及string的简单实现
char * strcat(char * dest,const char * src){ assert((dest!=NULL)&&(src!=NULL)); char *ret=dest; while(*dest++); dest--; while(*dest++=*src++); return ret; } char * strcpy(char * dest,const char * src){ assert((dest!=NULL)&&(src!=NULL)); char *ret=dest; while(*dest++=*src++); return ret; } int strlen(const char * src){ assert(src!=NULL); int len=0; while(*src++!='\0') len++; return len; } int strcmp(const char * src,const char * dest){ assert((dest!=NULL)&&(src!=NULL)); int ret=0; while(!(ret=*(unsigned char *)src-*(unsigned char *)dest)&&*dest){ ++src; ++dest; } return ret; } const char * strstr(const char * src,const char * sub){ assert((dest!=NULL)&&(src!=NULL)); const char * bp; const char * sp; while(*src){ bp=src; sp=sub; while(*bp++==*sp++){ if(!*sp) return src; } src++; } return NULL; }
下面是string类的简单实现:
class string { public: string(const char *str=NULL){ if(str==NULL){ mString=new char[1]; *mString='\0'; }else{ mString=new char[strlen(str)+1]; strcpy(mString,str); } } string(const string & other){//深复制,浅复制完成一个成员一个成员的拷贝,如果成员是类对象,则调用其拷贝构造函数或者默认拷贝构造函数,如果两个对象有指针,则做赋值运算,两个对象的指针指向同一块内存地址,两次析构delete p同一块内存会崩溃 mString=new char[strlen(str)+1]; strcpy(mString,other.mString); } ~string(void){ if(mString!=NULL){ delete []mString; mString=NULL; } } string & operator=(const string &other){ if(this==&other){//检查两个对象是否为同一个 return *this; } delete []mString;//释放原有对象的内存 mString=new char[strlen(str)+1]; strcpy(mString,other.mString); return *this; } string* operator&();//取址运算符 const string* operator&() const;//const取址运算符 private: char * mString; };

浙公网安备 33010602011771号