晚上好。对不起标题我无法更准确地解决这个问题。
以下代码不显示任何内容,除非:
1。我在开头推迟了三条未使用的注释行,没有任何冲突。
2。除非我在main()中将“Hello”更改为“Hello world”。
我正在使用代码块10.05。
完整代码:
#include <iostream>
using namespace std;
class stringclass
{
protected :
inline bool success() { failbit = false; return true; } //line to ignore
inline bool fail() { failbit = true; return false; } //line to ignore
public :
bool failbit; //line to ignore
char * mystring;
long memsize;
long length;
void reset();
void alloc(long newsize);
void copy(const stringclass & other);
stringclass(const char str[]);
stringclass() {reset(); }
stringclass(const stringclass & other) {copy(other); }
~stringclass() {delete [] mystring;}
friend ostream& operator << (ostream& out, stringclass & obj) {out << obj.mystring; return out;}
};
void stringclass::reset()
{
delete [] mystring;
mystring = NULL;
length = 0;
memsize = 0;
}
void stringclass::alloc(long newsize)
{
delete [] mystring;
mystring = new char[newsize];
memsize = newsize;
mystring[0] = 0;
length = 0;
}
void stringclass::copy(const stringclass & other)
{
if(other.mystring == NULL) reset();
else
{
alloc(other.memsize);
strcpy(mystring, other.mystring);
length = strlen(mystring);
}
}
stringclass::stringclass(const char str[])
: mystring(NULL), memsize(0), length(0)
{
if(str == NULL) reset();
else
{
alloc(strlen(str) + 1);
strcpy(mystring, str);
length = strlen(mystring);
}
}
int main()
{
stringclass str = "Hello";
stringclass str2 = str;
cout << "str = " << str << endl;
cout << "str2 = " << str2 << endl;
cout << endl;
system("PAUSE");
return 0;
}
代码显示:
str =
str2 =
Press any key to continue...
代码更改后:
str = Hello
str2 = Hello
Press any key to continue...
代码更改后:
str = Hello world
str2 = Hello world
Press any key to continue...
答案 0 :(得分:2)
我刚试过这个,并且遇到了段错误。
读取代码 - 您不确定字符串是否以空值终止。 strcpy()和strlen()期望字符串为空终止。这肯定会导致随机行为。我运行你的代码,得到了一个段错误 - 当打印长度是垃圾值。这很可能是你的问题。
答案 1 :(得分:1)
有一个明显的错误:stringclass::reset()
和stringclass::alloc()
delete[]
s stringclass::mystring
,即使它是NULL或已整合。更好:
stringclass::stringclass()
: mystring(0), memsize(0), length(0) {}
void stringclass::reset()
{
if(mystring) delete[] mystring;
mystring = 0;
memsize = 0;
length = 0;
}
void stringclass::alloc(long newsize)
{
if(memsize < newsize) {
if(mystring) delete[] mystring;
memsize = newsize;
mystring = new char[memsize];
}
length = 0;
}
等...但要好得多:使用std::string
。
答案 2 :(得分:1)
您的stringclass的复制构造函数未初始化类成员。
在实现这样的复制构造函数时,它应该可以工作。
stringclass::stringclass(const stringclass & other)
: mystring(0), memsize(0), length(0)
{
copy(other);
}