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

C++调用std::string::replace插入字符串时内容截断问题排查

问题描述

需要实现将字符串str1插入到字符串str0指定位置n的功能:如果str1长度小于str0从位置n到末尾的剩余子串长度,str0位置n之后的原有内容需要保留。
最初计划使用std::string::replace()实现需求,编写的初始测试代码如下:

#include <string>
#include <stdint.h> 
#include <iostream>

int main()
{
    std::string str0 = "ABCDEFGHIJ";
    std::string str1 = "000";
    
    uint16_t n = 3;
    str0.replace(n, str1.length(), str1);
    std::cout << "TEST:" << str0 << std::endl;
    return 0;
}

预期上述代码输出结果为TEST:ABC000GHIJ,但实际运行输出为TEST:ABC000,字符串出现截断。

注解:实际代码中对字符串做了其他位置的修改,最初提供的示例代码未包含该逻辑,而这正是触发问题的实际根因,因此调整示例代码,补充完整错误触发逻辑的复现代码如下:

#include <string>
#include <stdint.h> 
#include <iostream>

#define max_len 20

int main()
{
    std::string str0 = "ABDCDEF";
    std::string str1 = "";
    
    uint16_t n = 3;
    std::getline(std::cin, str1);

    if(!str1.empty() && str1[str1.size()-1] == '\n') {
        str1.erase(str1.size()-1);
    }
    str1.resize(max_len);

    str0.replace(n, str1.length(), str1);
    std::cout << "TEST:" << str0 << std::endl;
    return 0;
}
问题根因
  • std::string::resize会直接将字符串的长度修改为传入的参数值:如果传入长度大于字符串原长,会在字符串末尾填充空字符直到达到指定长度。
  • 后续调用replace时,会将str1的全长内容(包含resize填充的所有空字符)插入到str0中,最终打印时遇到空字符就会停止输出,表现为字符串被截断。
可行解决方案

调整resize的触发条件:仅当str1.length() > max_len时才执行resize操作截断超长输入,避免长度不足的输入字符串被强行填充空字符拉长。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 01:36:32