如何理解c/c++和php语言的区别( 三 )


16. memcpy函数的实现
void *memcpy(void *dest, const void *src, size_t count) {
char *tmp = dest;
const char *s = src;
while (count--)
*tmp++ = *s++;
return dest;
}
17. Strcpy函数实现
char *strcpy(char *dst,const char *src) {
assert(dst != NULL && src != NULL);
char *ret = dst;
while((* dst++ = * src++) != '') ;
return ret;
}
18. strcat函数的实现
char *strcat(char *strDes, const char *strSrc){
assert((strDes != NULL) && (strSrc != NULL));
char *address = strDes;
while (*strDes != ‘′)
++ strDes;
while ((*strDes ++ = *strSrc ++) != ‘′)
return address;
}
19.strncat实现
char *strncat(char *strDes, const char *strSrc, int count){
assert((strDes != NULL) && (strSrc != NULL));
char *address = strDes;
while (*strDes != ‘′)
++ strDes;
while (count — && *strSrc != ‘′ )
*strDes ++ = *strSrc ++;
*strDes = ‘′;
return address;
}
20. strcmp函数实现
int strcmp(const char *str1,const char *str2){
/*不可用while(*str1++==*str2++)来比较 , 当不相等时仍会执行一次++ , 
return返回的比较值实际上是下一个字符 。应将++放到循环体中进行 。*/
while(*str1 == *str2){
if(*str1 == '')
return0;
++str1;
++str2;
}
return *str1 - *str2;
}
21. 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);
}
22.strlen函数实现
int strlen(const char *str){
assert(str != NULL);
int len = 0;
while (*str ++ != ‘′)
++ len;
return len;
}
23. strpbrk函数实现
char * strpbrk(const char * cs,const char * ct){
const char *sc1,*sc2;
for( sc1 = cs; *sc1 != ''; ++sc1){
for( sc2 = ct; *sc2 != ''; ++sc2){
if (*sc1 == *sc2){
return (char *) sc1;
}
}
}
return NULL;
}
24. 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;
}
25. 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 = ‘′; //赋一个’′
}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;
}
26. C语言同意一些令人震惊的结构,下面的结构是合法的吗 , 如果是它做些什么?
int a = 5, b = 7, c;
c = a+++b; 等同于 c = a++ + b;
因此, 这段代码持行后a = 6, b = 7, c = 12 。
27. 用struct关键字与class关键定义类以及继承的区别
(1)定义类差别
struct关键字也可以实现类 , 用class和struct关键字定义类的唯一差别在于默认访问级别:默认情况下 , struct成员的访问级别为public , 而class成员的为private 。语法使用也相同 , 直接将class改为struct即可 。


推荐阅读