1. ホーム
  2. c++

[解決済み] std::string を const char* または char* に変換する方法

2022-02-02 07:59:58

質問

を変換するにはどうすればよいですか? std::stringchar* または const char* ?

解決方法は?

を渡したいだけなら std::string を必要とする関数に const char* を使用することができます。

std::string str;
const char * c = str.c_str();

のように、書き込み可能なコピーを取得したい場合。 char * を使えば、それが可能になります。

std::string str;
char * writable = new char[str.size() + 1];
std::copy(str.begin(), str.end(), writable);
writable[str.size()] = '\0'; // don't forget the terminating 0

// don't forget to free the string after finished using it
delete[] writable;

編集 : 上記は例外安全でないことに注意してください。もし new の呼び出しと delete の呼び出しがスローされると、何も呼び出されないので、メモリがリークすることになります。 delete を自動的に実行します。これを解決するには、即座に2つの方法があります。

boost::scoped_array

boost::scoped_array は、スコープ外に出たときにメモリを削除してくれます。

std::string str;
boost::scoped_array<char> writable(new char[str.size() + 1]);
std::copy(str.begin(), str.end(), writable.get());
writable[str.size()] = '\0'; // don't forget the terminating 0

// get the char* using writable.get()

// memory is automatically freed if the smart pointer goes 
// out of scope

std::vector

これは標準的な方法です(外部ライブラリを必要としません)。この方法では std::vector を使えば、メモリを完全に管理することができます。

std::string str;
std::vector<char> writable(str.begin(), str.end());
writable.push_back('\0');

// get the char* using &writable[0] or &*writable.begin()