gpt4 book ai didi

c++ - 为用户定义的字符串类重载 >> 运算符

转载 作者:行者123 更新时间:2023-11-30 03:01:49 24 4
gpt4 key购买 nike

问题

问题是我正在尝试使用插入运算符获取用户输入并初始化值 thechars,以将大小分配给 thechars 我需要输入的长度,如何获取它?并在插入运算符中初始化。

主要问题是插入运算符。

当我运行程序时它显示段错误,

求助

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;

最佳答案

如果in是一个文件输入流,你可以这样做:

in.seekg(0, ios::end);
length = in.tellg();
in.seekg(0, ios::beg);

另一种选择是逐个字符地读取输入流,并将 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 的类型.您真的需要所有这些手动内存处理吗?

关于c++ - 为用户定义的字符串类重载 >> 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10750360/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com