私はstd::stringを**char*またはchar[]**のデータ型に変換したいのですが。
std::string str = "string";
char* chr = str;
結果は以下の通りです。"error: cannot convert 'std::string' to 'char' ... "となります。
このような場合、どのような方法がありますか?
自動的には変換されません(よかった)。C言語の文字列バージョンを取得するには、c_str()
というメソッドを使用する必要があります。
std::string str = "string";
const char *cstr = str.c_str();
このメソッドは const char *
を返すことに注意してください。c_str()
が返す C 形式の文字列を変更することはできません。それを処理したい場合は、まずコピーしなければなりません。
std::string str = "string";
char *cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());
// do stuff
delete [] cstr;
あるいは現代のC++では
std::vector<char> cstr(str.c_str(), str.c_str() + str.size() + 1);
同じ内容をC言語で表現した文字列が欲しい場合。
char const* ca = str.c_str();
新しい内容のCスタイルの文字列が欲しい場合、(コンパイル時に文字列のサイズがわからない場合)1つの方法として、ダイナミックアロケーションがあります。
char* ca = new char[str.size()+1];
std::copy(str.begin(), str.end(), ca);
ca[str.size()] = '剉j0'。
後でdelete[]`するのを忘れないでください。
代わりに静的に割り当てられた、限られた長さの配列が欲しい場合。
size_t const MAX = 80; // 最大文字数
char ca[MAX] = {};
std::copy(str.begin(), (str.size() >= MAX ? str.begin() + MAX : str.end()), ca);
これは、暗黙のうちにこれらの型に変換する必要があることは、設計上の問題であるという単純な理由によるものです。本当に必要なのかどうかを確認してください。
もし絶対にchar*
が必要であれば、おそらく_best_な方法があります。
vector<char> v(str.begin(), str.end());
char* ca = &v[0]; // pointer to start of vector