自定义String与嵌套Vector的C++程序输出乱码问题求助
自定义String类输出乱码问题的分析与解决
问题回顾
你实现了自定义的Vector容器和String类,想要完成读取字符串、字典序排序后输出的功能,但编译通过后所有非空测试用例都出现了乱码输出。最终你自己定位到了std::ostream& operator <<的实现错误,这里我再详细拆解下问题原因和修正逻辑。
为什么会出现乱码?
你最初的输出运算符实现是这样的:
std::ostream& operator << (std::ostream& os, const String& string) { os << string.begin(); return os; }
这里直接把string.begin()返回的const char*传给了ostream。而标准库中ostream处理char*类型时,默认会把它当作C风格字符串来处理——它会从指针指向的位置开始输出字符,直到遇到'\0'(空字符)才停止。
但你的String类内部用自定义Vector<char>存储字符,并没有在字符序列的末尾添加'\0'终止符。这就导致输出时,程序会越界读取Vector内存之后的随机数据,直到碰巧遇到一个'\0',这就是你看到乱码的原因。
正确的实现方式
你后来修改的遍历输出方式是完全正确的:
std::ostream& operator << (std::ostream& os, const String& string) { for(auto x : string) os << x; return os; }
这种方式会逐个遍历String中存储的每一个字符并输出,完全不依赖'\0'终止符,能准确输出所有有效字符,自然就解决了乱码问题。
额外的小建议
你的String类里还有一个冗余的std::size_t size;成员变量,它既没有在构造函数中初始化,也没有在operator+=、clear等修改字符串的操作中同步更新。这个变量会导致未定义行为,建议直接移除它——你完全可以通过内部Vector<char>的size()方法来获取字符串长度。
内容的提问来源于stack exchange,提问作者Aris Martin Accola
相关产品推荐
相关产品推荐

