i am trying to implement and operator that gets rhs obj and lhs obj, the object contains char* string; for for e.g s1 contains "eden" s2 contains "sh" I want that s3 = s1 s2 will be "eden sh" yet I cannot figure it out. I don't USE vector or std::string because the assignment was to do char* arr code:
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);
***set name is a function that copies buffer to m_name private data member.
the result is edensh
CodePudding user response:
It looks as if you are forgetting to account for the " " char on the offset.
std::strncpy(buff std::strlen(lhs.getName()) 1, rhs.getName(), std::strlen(rhs.getName()));
CodePudding user response:
If you compare these two records
std::strncpy(buff std::strlen(lhs.getName())," ", sizeof(char));
std::strncpy(buff std::strlen(lhs.getName()), rhs.getName(), std::strlen(rhs.getName()));
you will see that they both start write at position buff std::strlen(lhs.getName())
. So the second call of strncpy
overwrites symbols of the previous call of strncpy
.
Also there is another problem. The result array does not contain a string because the stored sequence of characters is not appended with the terminating zero character '\0'
.
Instead you could write for example
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);
Also instead of this call of the function strcpy
std::strcpy( buff n, " " );
it is enough to write
buff[n] = ' ';
So you can also write
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);