在公共类中使用 C++ 字符* 时出现问题,无法访问 char 指针

Trouble working with char* in C++, in a class, which is public cannot access a char pointer

本文关键字:问题 指针 char 访问 字符 C++      更新时间:2023-10-16

我对C++很陌生,这是我的代码。我需要有关string_1::tolower()和toupper()的帮助。可能有一个小错误,但我找不到它。我正在尝试为字符串构建一个类,其中包含重载的运算符和函数。程序运行良好,直到"最后一个带有tolower的字符串",然后一旦我们访问类中的string(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!='')
    {
        if(*temp>='A'&&*temp<='Z')
        {
            (*temp)+=offset;
        }
        temp++;
    }
    return;

}
void string_1::toupper()
{
    char offset=32;
    char *temp=str;
    cout<<str;
    while(*temp!='')
    {
        if(*temp>='a'&&*temp<='z')
        {
            cout<<"INt"<<*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 constructorn";
}
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++!='') 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!='')
    {
        *ret_str=*temp;
        ret_str++;
        temp++;
    }
    while(*b_str!='')
    {
        *ret_str=*b_str;
        b_str++;
        ret_str++;
    }
    *ret_str='';
    // 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;
}

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

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

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

顺便说一句,您的类可能应该保留(并检查)分配的大小,这样您就不会溢出str缓冲区。

感谢您的帮助!!我从你的答案中得到了一些重要的知识。不能+1任何人,因为有足够的代表。我不知何故设法调整了代码。我所做的是:改进 = 运算符来排列字符串。这就是问题所在.我想我们在任何情况下都无法编辑常量字符串。 加上添加的 +=。 #include #include 使用命名空间标准; /* 使用控制台暂停器运行此程序或添加您自己的 getch、系统("暂停")或输入循环 */ 类 string_1{ 公共: 字符 *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!='')
    {
        if(*temp>='A'&&*temp<='Z')
        {
            (*temp)+=offset;
        }
        temp++;
    }
    return;

}
void string_1::toupper()
{
    char offset=32;
    char *temp;
    temp=str;
//  cout<<str;
    while(*temp!='')
    {
        if(*temp>='a'&&*temp<='z')
        {
        //  cout<<"INt";
            *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 constructorn";
}
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++!='') 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!='')
    {
        *ret_str=*temp;
        ret_str++;
        temp++;
    }
    while(*b_str!='')
    {
        *ret_str=*b_str;
        b_str++;
        ret_str++;
    }
    *ret_str='';
    // 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!='')
    {
        *temp1++=*temp++;
    }
    delete[] str;
    bb=b.str;
    while(*bb!='')
    {
        *temp1++=*bb++;
    }
    *temp1='';
    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;
}