读书人

关于字符串拼接的有关问题

发布时间: 2012-10-19 16:53:36 作者: rapoo

关于字符串拼接的问题
这是我写的程序
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到底是指向那里,释放也会有问题了.
所以建议构造函数改进一下,意见仅供参考.
[解决办法]

C/C++ code
#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的数据。

读书人网 >C++

热点推荐