C++中char*缓冲区使用strlen拼接字符串的Bug排查求助
问题分析与修复
你的代码核心问题是覆盖了空格字符,同时缺少字符串终止符,导致拼接结果不符合预期。
错误点拆解
- 第三个
std::strncpy的起始地址错误,直接覆盖了刚写入的空格:
你把右侧字符串写到了buff + std::strlen(lhs.getName())的位置,和写入空格的地址完全一致,空格被直接覆盖,自然不会显示。 - 没有手动添加字符串终止符
'\0':std::strncpy不会自动在目标缓冲区末尾添加终止符,当源字符串长度等于指定复制长度时,缓冲区会缺少终止符,可能引发未定义行为。
修复后的代码
// 计算总长度:左字符串长度 + 右字符串长度 + 空格1个 + 终止符1个 auto *buff = new char[std::strlen(lhs.getName()) + std::strlen(rhs.getName()) + 2]; assert(buff); const size_t lhs_len = std::strlen(lhs.getName()); // 复制左字符串 std::strncpy(buff, lhs.getName(), lhs_len); // 写入空格,位置是左字符串末尾 buff[lhs_len] = ' '; // 复制右字符串,起始位置是左长度+1(跳过空格) std::strncpy(buff + lhs_len + 1, rhs.getName(), std::strlen(rhs.getName())); // 添加字符串终止符,位置是总长度的末尾 buff[lhs_len + 1 + std::strlen(rhs.getName())] = '\0'; tmp.setName(buff); // 注意:如果setName内部已经复制了buff的内容,记得delete[] buff避免内存泄漏 delete[] buff;
额外说明
- 提前计算左字符串长度可以避免多次调用
std::strlen,提升效率。 - 直接用数组下标赋值空格和终止符比
strncpy更直观,也避免了不必要的函数调用。 - 用完动态分配的
buff后一定要释放内存,防止内存泄漏。
内容的提问来源于stack exchange,提问作者0xDEADBEEF
相关产品推荐
相关产品推荐

