问题是我正在尝试使用插入运算符获取用户输入并初始化值thechars
,将大小分配给我需要输入长度,我如何得到它?并在插入运算符中初始化。
主要问题在于插入操作符。
当我运行程序时,它会显示分段错误,
plz help
class string1
{
private:
int len;
char *thechars;
//friend ostream& operator<<(ostream&,string1&);##
//friend istream& operator>>(istream&,string1&);##
public:
//string1() :len(0),thechars(NULL){}
string1()
{
thechars = new char[1];
thechars[0] = '\0';
len=0;
// cout << "\tDefault string constructor\n";
// ConstructorCount++;
}
};
// this is the insertion operator i use
istream& operator>>(istream& in, string1& tpr)
{
in >> tpr.thechars;
//tpr.thechars[i+1]='\0';
return in;
}
//this one is the extraction operator
ostream& operator<<(ostream& out,string1& prt)
{
for(int i=0;i<prt.len;i++)
out<<prt.thechars[i];
return out;
}
// main function##
string1 str;
cout << "enter first string" << endl;
cin >> str;
cout << str << endl;
答案 0 :(得分:2)
如果in
是文件输入流,您可以执行以下操作:
in.seekg(0, ios::end);
length = in.tellg();
in.seekg(0, ios::beg);
另一个选项是按char读取输入流char,每次耗尽时加倍thechars
的大小。首先,引入另一个变量来存储当前分配的缓冲区大小--- allocSize
。之后更新构造函数和operator<<
,如下所示。
构造
string1()
{
allocSize = 1; // initially allocated size
thechars = new char[allocSize];
thechars[0] = '\0';
len=0;
}
输入操作员:
istream& operator>>(istream& in, string1& tpr)
{
char inp;
while (in.get(inp)) {
// end-of-input delimiter (change according to your needs)
if (inp == ' ')
break;
// if buffer is exhausted, reallocate it twice as large
if (tpr.len == tpr.allocSize - 1) {
tpr.allocSize *= 2;
char *newchars = new char[tpr.allocSize];
strcpy(newchars, tpr.thechars);
delete[] tpr.thechars;
tpr.thechars = newchars;
}
// store input char
tpr.thechars[tpr.len++] = inp;
tpr.thechars[tpr.len] = '\0';
}
}
但最好的选择是使用std::string
作为thechars
的类型。你真的需要所有这些手动内存处理吗?
答案 1 :(得分:1)
而不是给in
char*
赋予它一个常规字符串。然后你可以自己提取数据。
istream& operator>>(istream& in, string1& tpr)
{
string temp;
in >> temp;
tpr.len = temp.length + 1;
tpr.thechars = new char[tpr.len];
tpr.thechars[temp.length] = '\0';
strcpy(tpr.thechars, &temp[0], tpr.len);
return in;
}
答案 2 :(得分:0)
in>> tpr.thechars; // where thechars="\0";
你只分配了一个字节,但我猜你是带有更多字节的输入字符串。 我认为这里有错误。