我是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;
}
答案 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;
}