On Sep 9, 11:49 pm, Seungbeom Kim <musip...@bawi.org> wrote:
On 2010-09-08 23:53, Kai Wen wrote:
On 2010-09-09, SG <s.gesem...@gmail.com> wrote:
vector<char> temp;
temp.reserve(thestring.size()+1);
temp.assign(thestring.begin(),thestring.end());
temp.push_back('\0');
foo(&temp[0]);
thestring = &temp[0];
But I think this method is too complex. :-(
Maybe the four lines before calling foo can be shortened to two:
const char *b = thestring.c_str(), *e = b + thestring.size() + 1;
vector<char> temp(b, e);
Or even to:
std::vector<char> temp(thestring.begin(), thestring.end());
Similarly, the last line could just as easily be:
thestring.assign(temp.begin(), temp.end());
The best solution depends on context, however. If the legacy
function is actually returning a string value in the buffer (and
doesn't use the initial contents), something like the following
may be appropriate:
std::string
getCurrentWorkingDirectory()
{
std::vector<char> results( 1000 );
errno = 0;
while ( getcwd(&results[0], results.size() ) == NULL
&& errno == ERANGE) {
results.resize( 2 * results.size() );
errno = 0;
}
if ( errno != 0 )
throw SomeError();
return std::string( results.begin(), results.end() );
}
(I've used the Posix function getcwd as an example, but of
course there are tons of functions for which this would be
appropriate, but under Posix and under Windows.)