在公共类中使用 C++ 字符* 时出现问题,无法访问 char 指针
Trouble working with char* in C++, in a class, which is public cannot access a char pointer
我对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;
}
相关文章:
- 关于 c++ 函数中指针赋值的简单问题
- 链表指针问题
- C++ 关于指针取消引用的技术问题
- C++中的指针和常量问题不大
- 包含矢量指针的结构的内存释放问题
- 指针问题:从不兼容的类型"int"分配给"int *"
- 将字节数组转换为带有字节序问题的指针
- 关于如何使用指向主窗口的指针的 QT 问题
- 当成员值从指针更改为非指针时,C++常量问题
- 为什么循环会导致指针出现问题?
- 使用指针计算堆栈问题的大 O 表示法
- 构造函数 (C++) 中的 char 指针参数存在问题
- 指向包含对齐 C 结构C++类的 C 指针的对齐问题
- 涉及指针和手动实现的矩阵类的问题
- 从基指针到派生的强制转换问题
- 迭代器的指针操作问题
- 64 位迁移问题:指针更改
- C++模板使用问题指针
- 跳到C++第13章练习问题4-指针
- 用std::pair数组初始化std::map问题(指针错误?)