Если вам действительно нужен доступный для записи буфер char, скопированный из содержимого std :: string, вы можете использовать std::vector<char>
std::vector<char> urlAsVec( sup.begin(), sup.end() );
urlAsVec.push_back( '\0' );
char * url = &urlAsVec[0]; // pointer you can safely write to
Вы также можете инициализировать вектор следующим образом:
std::vector<char> urlAsVec( sup.c_str(), sup.c_str() + sup.size() + 1 );
, который также напишет ваш нулевой терминатор для вас.
Другая альтернатива:
std::vector<char> urlAsVec( sup.size() + 1 );
sup.copy( &urlAsVec[0], sup.size() );
Обратите внимание, что ваш вектор автоматически инициализирует все свои элементы равными 0, поэтому нулевой терминатор будет там, даже если sup.copy () не записывает его. В любом случае вы можете использовать sup.copy( ptr, len)
вместо strcpy, что немного безопаснее, поскольку вы можете указать размер буфера (хотя strncpy и это допустит), хотя вам все равно придется писать нулевой терминатор вручную (или он уже выделен) .
Например, если вы используете это:
char url[ BUFLEN ] = {0};
sup.copy( url, BUFLEN-1 );
для некоторого фиксированного значения BUFLEN вы получите копию или частичную копию исходной строки, записанной в ваш буфер. Обратите внимание, что мой инициализатор гарантирует, что все ваши неписанные байты равны 0.