关于字符串拼接的问题
这是我写的程序
class str
{
char *m_str;
public:
str()
{
m_str=NULL;
}
str(char *ptr)
{
m_str=ptr;
}
str(const str &ptr)
{
m_str = new char[strlen(ptr.m_str)+1];
strcpy(m_str,ptr.m_str);
}
str operator +=(const str &ptr)
{
char *q=ptr.m_str;
while(*m_str!='\0')
{
m_str++;
}
while(*q!='\0')
{
//cout<<*q<<endl;
*m_str=*q;
// cout<<*m_str<<endl;
m_str++;
q++;
}
*m_str='\0';
cout<<strlen(m_str)<<endl;
cout<<m_str;
return *this;
}
// friend str operator +(const str &ptr1,const str &ptr2);
};
int main()
{
str k("dhfg");
str l(k);
str m("12345");
k+=m;
return 0;
}
想通过操作符+=实现字符串拼接,但是到了这一行*m_str=*q;程序就运行不了,不知道哪里错了
[解决办法]
str operator +=(const str &ptr)
实现上有问题,在拼接2个字符串时,应该重新分配空间,因为原来分配的空间不足以容纳2个字符串了.
[解决办法]
上面说还有一个问题是,后2个构造函数:
一个让m_str指向一个常量字符串,另一个则动态分配空间,到最后不清楚m_str到底是指向一个常量字符串还是一个堆上的空间.
另外,至少应该存在一个析构函数,来释放分配的空间,但由于上述原因,区分不了m_str到底是指向那里,释放也会有问题了.
所以建议构造函数改进一下,意见仅供参考.
[解决办法]
#include <iostream>class string {public: string (const char *ch=NULL); string (const string &str); ~string(); const string operator + (const string &str); string &operator += (const string &str); friend std::ostream& operator<<(std::ostream &out,const string &str); int Length()const;private: char *pch;};string::string(const char *ch){ if(ch) { pch = new char [strlen(ch)+1]; strcpy(pch,ch); } else pch = NULL;}string ::string(const string &str){ pch = new char[str.Length()+1]; strcpy(pch,str.pch);}string ::~string(){ if(pch) { delete []pch; pch = NULL; }}string &string::operator+=(const string &str){ string temp(*this); delete []pch; pch = new char[temp.Length()+str.Length()+1]; strcpy(pch,temp.pch); strcat(pch,str.pch); return *this;}const string string::operator+(const string &str){ return string(*this+=str);}int string::Length()const{ if(pch) return strlen(pch); return 0;}std::ostream& operator<<(std::ostream &out,const string &str){ out<<str.pch; return out;}int main(){ string str("I love"); //if((str+"c++") = "") 返回重载+返回const的原因,不返回const 这句也正确 std::cout<<str+" c++"<<std::endl; return 0;}
[解决办法]
1:你的程序运行不了主要是第二个构造出问题了,你在初始化的时候,传入的“dhfg”和“12345”,属于常量字符串,存储在常量区,这部分的值是不允许程序修改的,而你在初始化时,会调用第二个构造,这样你的m_str指向这两个常量字符串的首地址,在进行拼接时,试图修改常量区的数值,不允许,故出错。应该用第三个构造的方式来分配一块内存拷贝常量的数据。
2:在拼接时,注意字符串的存储空间是否够用,不够用可能也会成功,但可能会覆盖一些数据,也许发现不了,但会潜藏bug。
3:在拼接时,记得存储下m_str的起始地址,在拼接完了的时候,注意将这个地址重新赋值回去,否则你的m_str将只有一个'\0’;或者你可以用一个临时的指针变量来操作m_str的数据。