使用strlen错误的c++中char*的缓冲区



我正在尝试实现and+运算符,该运算符用于获取rhs-obj和lhs-obj,对象包含char*string;for for例如s1包含";eden";s2包含";sh";我希望s3=s1+s2将是"0";eden-sh";但我想不通。我不使用vector或std::string,因为赋值是做char*arr代码:

auto *buff = new char[std::strlen(lhs.getName()) + std::strlen(rhs.getName()) + 2];
assert(buff);
std::strncpy(buff, lhs.getName(), std::strlen(lhs.getName()));
std::strncpy(buff + std::strlen(lhs.getName())," ", sizeof(char));
std::strncpy(buff + std::strlen(lhs.getName()), rhs.getName(), std::strlen(rhs.getName()));
tmp.setName(buff);

***setname是一个将缓冲区复制到m_name私有数据成员的函数。

结果是edensh

如果比较这两个记录

std::strncpy(buff + std::strlen(lhs.getName())," ", sizeof(char));
std::strncpy(buff + std::strlen(lhs.getName()), rhs.getName(), std::strlen(rhs.getName()));

您将看到它们都在位置CCD_ 1处开始写入。因此CCD_ 2的第二次调用覆盖了CCD_ 3的前一次调用的符号。

另外还有一个问题。结果数组不包含字符串,因为存储的字符序列没有附加终止的零字符''

相反,你可以写例如

size_t n = std::strlen( lhs.getName() );
auto *buff = new char[n + std::strlen(rhs.getName()) + 2];
assert(buff);
std::strcpy( buff, lhs.getName() );
std::strcpy( buff + n, " " );
std::strcpy (buff + n + 1, rhs.getName() );
tmp.setName(buff);

同样代替函数strcpy的调用

std::strcpy( buff + n, " " );

写就足够了

buff[n] = ' ';

所以你也可以写

size_t n = std::strlen( lhs.getName() );
auto *buff = new char[n + std::strlen(rhs.getName()) + 2];
assert(buff);
std::strncpy( buff, lhs.getName(), n );
buff[n] = ' ';
std::strcpy (buff + n + 1, rhs.getName() );
tmp.setName(buff);

看起来你好像忘记了解释"quot;偏移上的字符。

std::strncpy(buff + std::strlen(lhs.getName()) + 1, rhs.getName(), std::strlen(rhs.getName()));

最新更新