You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为自定义String类正确重载std::istream的operator>>运算符

自定义String类的operator>>重载规范实现

现有实现存在的问题

你当前的代码不止缺少终止符的问题,还存在多个不符合规范的点:

  • 直接按obj.size固定长度读取内容,未判断输入长度是否超过当前缓冲区容量,会触发堆内存溢出
  • 读取结束后未追加\0终止符,str成员无法作为C风格字符串正常使用,后续操作大概率会出现越界访问
  • 不符合C++标准库输入运算符的默认行为:标准operator>>默认会跳过前导空白字符,读取到下一个空白字符(空格、换行、制表符等)就停止,而非读取固定长度内容

符合规范的实现

实现逻辑

  1. 先跳过输入流的前导空白字符,对齐标准std::string的输入行为
  2. 逐字符读取输入内容,直到遇到空白字符或流结束
  3. 读取过程中动态扩容缓冲区,保证可以容纳所有输入内容
  4. 读取完成后主动在末尾追加\0终止符,同步更新size和capacity成员
  5. 保留输入流的错误状态,符合IO运算符的返回约定

完整代码实现

#include <cctype> // 用于isspace判断空白字符
#include <utility> // 用于move操作

std::istream& operator>>(std::istream& is, String& obj) {
    // 先跳过前导空白字符
    char ch;
    while (is.get(ch) && std::isspace(static_cast<unsigned char>(ch))) {
        // 空循环,跳过所有前导空白
    }

    // 如果流已经失败,直接返回
    if (!is) {
        return is;
    }

    // 先释放原有内存,重置状态
    delete[] obj.str;
    obj.size = 0;
    obj.capacity = 16; // 初始容量可根据需求调整
    obj.str = new char[obj.capacity];

    // 把刚才读到的第一个非空白字符放入缓冲区
    obj.str[obj.size++] = ch;

    // 读取后续字符,直到遇到空白或流结束
    while (is.get(ch) && !std::isspace(static_cast<unsigned char>(ch))) {
        // 容量不足时2倍扩容
        if (obj.size + 1 >= obj.capacity) {
            size_t new_capacity = obj.capacity * 2;
            char* new_buf = new char[new_capacity];
            // 拷贝原有内容
            for (size_t i = 0; i < obj.size; ++i) {
                new_buf[i] = obj.str[i];
            }
            // 替换缓冲区
            delete[] obj.str;
            obj.str = new_buf;
            obj.capacity = new_capacity;
        }
        obj.str[obj.size++] = ch;
    }

    // 追加字符串终止符
    obj.str[obj.size] = '\0';

    // 读到的空白符放回输入流,对齐标准库输入行为
    if (is) {
        is.unget();
    }

    return is;
}

注意事项

  • 如果你的String类已经实现了reserve、push_back之类的成员方法,可以直接复用这些方法简化重载代码,不需要手动处理扩容逻辑
  • 上述实现已经处理了输入流失败的边界情况,不会出现内存泄漏
  • 如果需要读取整行内容(包含空格),可以额外重载getline函数,逻辑和上述实现类似,只需要把停止条件从空白符改成换行符即可

内容的提问来源于stack exchange,提问作者user16949111

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 13:45:02