小明学习了面向对象程序设计后,以字符指针作为数据成员设计了一个字符串类STRING,请你帮他实现输入输出运算符的重载(>>、<<)。 要求: (1)输入时以输入Enter键作为结束标志,允许输入长度不超过80个字符的可以包含空格、可以为空串的字符序列。 (2)输出时,仅输出字符串中的有效字符。字符串输出结束后,不输出换行符。
时间: 2024-02-28 15:55:21 浏览: 106
好的,我可以为你解答这个问题。
首先,我们需要在`STRING`类中声明友元函数`operator>>`和`operator<<`,用于重载输入输出运算符。代码如下:
```c++
class STRING
{
public:
// 构造函数
STRING();
// 重载输入输出运算符
friend istream& operator>>(istream& in, STRING& str);
friend ostream& operator<<(ostream& out, const STRING& str);
private:
char* data; // 字符串数据
int len; // 字符串长度
};
```
其中,`operator>>`是输入运算符的重载函数,参数为输入流对象和一个`STRING`对象的引用;`operator<<`是输出运算符的重载函数,参数为输出流对象和一个常量的`STRING`对象的引用。
接下来,我们可以在类外实现输入输出运算符的重载函数。代码如下:
```c++
istream& operator>>(istream& in, STRING& str)
{
char* buffer = new char[81]; // 定义一个缓冲区,用于存储输入的字符序列
in.getline(buffer, 81); // 从输入流中读取字符序列
int len = strlen(buffer); // 计算字符序列的长度
if (len > 0) // 如果字符序列非空
{
str.data = new char[len + 1]; // 分配足够的内存空间
strncpy(str.data, buffer, len); // 复制字符序列到字符串对象中
str.data[len] = '\0'; // 在字符串结尾添加一个空字符
str.len = len; // 更新字符串长度
}
else // 如果字符序列为空
{
str.data = new char[1]; // 分配一个字符的内存空间
str.data[0] = '\0'; // 添加一个空字符
str.len = 0; // 更新字符串长度
}
delete[] buffer; // 释放缓冲区内存空间
return in;
}
ostream& operator<<(ostream& out, const STRING& str)
{
for (int i = 0; i < str.len; i++)
{
out << str.data[i]; // 逐个输出字符串中的字符
}
return out;
}
```
在`operator>>`中,我们定义了一个缓冲区`buffer`,用于存储输入的字符序列。然后,我们使用`getline`函数从输入流对象中读取字符序列,最大长度为80个字符,以Enter键作为结束标志。接着,我们计算字符序列的长度,如果长度大于0,则分配足够的内存空间,并将字符序列复制到字符串对象中;如果长度为0,则分配一个字符的内存空间,并添加一个空字符。最后,我们释放缓冲区内存空间,并返回输入流对象的引用。
在`operator<<`中,我们逐个输出字符串中的有效字符,即前`len`个字符,然后返回输出流对象的引用。
通过以上的重载操作,我们就可以在程序中方便地使用输入输出运算符来操作`STRING`类对象了。
阅读全文