麻烦在C ++中使用char *,在一个类中,这是公共的,无法访问char指针

时间:2014-01-10 13:05:37

标签: c++ pointers char

我是C ++的新手,这是我的代码。我想要string_1 :: tolower()和toupper()的帮助。可能有一个小错误,但我找不到它。 我正在尝试使用重载的运算符和函数为字符串构建一个类。 程序运行良好,直到“最后一个字符串与tolower”,然后一旦我们访问类中的字符串(char)指针,它就会变得无法响应。它以错误代码退出,通常我们进入超出内存分配/不确定循环。  请仔细阅读代码并帮助我。

   #include <iostream>
 using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
class string_1{
    public:
        char *str;

        string_1();
        string_1(int i);
        void display(); 
        string_1 operator +(string_1 b);
    //  string_1 operator =(string_1  b);
        string_1 operator =(char *b);
    //  string_1& operator +=(string_1 const &b);
        int length();
        void tolower();
        void toupper();


};
void string_1::tolower()
{
    char offset='a'-'A';
    char *temp=str;
    while(*temp!='\0')
    {
        if(*temp>='A'&&*temp<='Z')
        {
            (*temp)+=offset;
        }
        temp++;
    }
    return;


}
void string_1::toupper()
{
    char offset=32;
    char *temp=str;
    cout<<str;
    while(*temp!='\0')
    {
        if(*temp>='a'&&*temp<='z')
        {
            cout<<"IN\t"<<*temp;
            *temp=*temp+offset;
        }
        temp++; 
    }


}

void string_1::display()
{
    char *temp=str;
    cout<<temp<<endl;
}
string_1::string_1()
{
    str=new char[10];
//  cout<<"In zero argument constructor\n";
}
string_1::string_1(int i)
{
    str=new char[i];
    //cout<<"In 1 arg constructor,made string_1 of "<<i<<endl;

}

int string_1::length()
{
    int len=0;
    char *temp=str;
    while(*temp++!='\0') len++;
    return len;
}
string_1 string_1::operator +(string_1 b)
{
    int len1,len2;

     char *temp,*b_str,*ret_str;
     b_str=b.str;
    temp=str;
    len1=length();
    len2=b.length();
    len1=len1+len2+1;
    cout<<"\n Debug: Lengths L1,L2:"<<len1<<" l2:"<<len2;

    string_1 ret(len1);
    ret_str=ret.str;
    while(*temp!='\0')
    {
        *ret_str=*temp;
        ret_str++;
        temp++;
    }
    while(*b_str!='\0')
    {
        *ret_str=*b_str;
        b_str++;
        ret_str++;
    }
    *ret_str='\0';

    // We have to make sure we do not mess up with str
    return ret;
}

string_1 string_1::operator =(char *b)
{
    delete[] str;
    str=b;
    return *this;
}

int main(int argc, char *argv[]) {

string_1 a(20),b,c,d,e;
a="Hello world !!!";
b="Hello C++";
c=a+b;
d="ABcd12!+]<>WxyZ";
cout.setf(ios::unitbuf);
cout<<"Displaying strings a,b,c,d"<<endl;
a.display();b.display();c.display();d.display();
cout<<"last string with tolower"<<endl;
//e=d;
d.tolower();d.display();
cout<<"last string with toupper"<<endl;
d.toupper();
d.display();

    return 0;
}

3 个答案:

答案 0 :(得分:0)

要使代码按原样运行,可以在=运算符中执行以下操作:

string_1 string_1::operator =(char *b)
{
    strcpy(str, b);
    return *this;
}

答案 1 :(得分:0)

字符串d="ABcd12!+]<>WxyZ"不适合默认大小10 - 它至少需要17个字符。要快速修复,请尝试增加构造函数中已分配的str的大小。

顺便说一下,你的班级应该保留(并检查)分配的大小,这样你就不会溢出str缓冲区。

答案 2 :(得分:0)

感谢您的帮助! 我对你的答案有了一些重要的了解。不能+1任何人,因为有足够的代表。 我以某种方式设法调整代码。 我所做的是:improve =运算符来strcpy字符串。那就是问题所在。我想我们无论如何都无法编辑const字符串。加上+ =。     #包括     #包括     using namespace std;     / *使用控制台暂停运行此程序或添加您自己的getch,系统(“暂停”)或输入循环* /     class string_1 {         上市:             char * str;

        string_1();
        string_1(int i);
    string_1( string_1 &b);

        void display(); 
        string_1 operator +(string_1 b);
    //  string_1 operator =(string_1  b);
        string_1& operator =(const char *b);
        string_1 operator +=(string_1 b);
        int length();
        void tolower();
        void toupper();


};

string_1::string_1(string_1 &b)
{
    str=b.str;

}
void string_1::tolower()
{
    char offset='a'-'A';
    char *temp=str;
    while(*temp!='\0')
    {
        if(*temp>='A'&&*temp<='Z')
        {
            (*temp)+=offset;
        }
        temp++;
    }
    return;


}
void string_1::toupper()
{
    char offset=32;
    char *temp;
    temp=str;
//  cout<<str;
    while(*temp!='\0')
    {
        if(*temp>='a'&&*temp<='z')
        {
        //  cout<<"IN\t";
            *temp=*temp-offset;
        //  cout<<"OUT";
        }
        temp++; 
    }


}

void string_1::display()
{
    char *temp=str;
    cout<<temp<<endl;
}
string_1::string_1()
{
    str=new char[10];
//  cout<<"In zero argument constructor\n";
}
string_1::string_1(int i)
{
    str=new char[i];
    //cout<<"In 1 arg constructor,made string_1 of "<<i<<endl;

}

int string_1::length()
{
    int len=0;
    char *temp=str;
    while(*temp++!='\0') len++;
    return len;
}
string_1 string_1::operator +(string_1 b)
{
    int len1,len2;

     char *temp,*b_str,*ret_str;
     b_str=b.str;
    temp=str;
    len1=length();
    len2=b.length();
    len1=len1+len2+1;
    cout<<"\n Debug: Lengths L1,L2:"<<len1<<" l2:"<<len2;

    string_1 ret(len1);
    ret_str=ret.str;
    while(*temp!='\0')
    {
        *ret_str=*temp;
        ret_str++;
        temp++;
    }
    while(*b_str!='\0')
    {
        *ret_str=*b_str;
        b_str++;
        ret_str++;
    }
    *ret_str='\0';

    // We have to make sure we do not mess up with str
    return ret;
}
string_1 string_1::operator +=(string_1 b)
{
    int len,len2;
    len=strlen(str);
    len2=strlen(b.str);
    len=len+len2+1;
    char *ret,*temp1,*bb;
    ret=new char[len];
    temp1=ret;
    char *temp=str;
    while(*temp!='\0')
    {
        *temp1++=*temp++;
    }
    delete[] str;
    bb=b.str;
    while(*bb!='\0')
    {
        *temp1++=*bb++;
    }
    *temp1='\0';
    str=ret;
    return *this;
}

string_1& string_1::operator =(const char *b)
{
    delete[] str;
    int len=strlen(b);

    str=new char[len+1];
    strcpy(str,b);


    return *this;
}

int main(int argc, char *argv[]) {

string_1 a(20),b,c,d,e;
a="Hello world !!!";
b="Hello C++";
c=a+b;
d="ABcd12!+]<>WxyZ";
cout.setf(ios::unitbuf);
cout<<"Displaying strings a,b,c,d"<<endl;
a.display();
b.display();
c.display();
d.display(); 
//c=d;
cout<<"last string with tolower"<<endl;

d.tolower();
d.display();
cout<<"last string with toupper"<<endl;
d.toupper();
d.display();
cout<<"Output of c+=d; ::";
c+=d;
c.display();
    return 0;
}