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
相关产品推荐
相关产品推荐

