我正在尝试实现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()));