【发布时间】:2021-12-16 13:26:57
【问题描述】:
我有一个字符串类。我想重载运算符>>。找到了以下方式,但据我了解,最后没有添加零字符(行终止符)。怎样才能写出好的算子>>?
class String {
public:
char* str;
size_t size;
size_t capacity;
~String();
String(const char*);
friend std::istream& operator>>(std::istream&, String&);
};
std::istream& operator>>(std::istream& is, String& obj) {
is.read(obj.str, obj.size);
return is;
}
【问题讨论】:
-
你可以用
obj.str[obj.size] = '\0';终止你的字符串...但是你有一个更基本的问题,那就是你的设计要求你分配一个长度完全正确的字符串before 从流中读取它。这不是来自流的字符串输入的工作方式。 -
@paddy 也就是需要在类外写一个单独的函数来实现?我不明白如何为我行事。我也做了 obj.str [obj.size] = '\ 0' 但我从 Valgrind 得到错误。分段错误(核心转储)
-
如果您尝试模拟标准字符串输入,则需要一次读取一个字符,直到确定字符串完整为止。也就是说,当您遇到任何空白字符时。每次读取一个字符时,都需要将其附加到字符串中,这意味着如果容量不足,您还需要增加字符串缓冲区。完成后,您编写一个最终的字符串终止符(如果您的课程需要它)。