char】C++の文字列クラスをchar型やchar配列、C言語形式の文字列へ変換またはコピーする方法を紹介します。char*std::string型のメンバ関数c_strで、C言語スタイルの文字列をポインタとして取得することができます。str.c_str();取得した文字列データを勝手に変更しないよう注意してください。ちなみにC++11環境であればc_str関数と同一の働きをするdata関数を利用することもできます。C++11よりも古い規格ではdata関数はNULL終端されていない文字列参照を返すケースがあるため注意が必要です。ダングリングポインタに注意するstd::string型オブジェクトの寿命が尽きた場合、c_str関数やdata関数で取得していたポインタは不定なものになります。pointer)と呼ばれ、誤って利用すると様々な問題を引き起こすことに繋がるため注意してください。char*上記のダングリングポインタを回避するためには、手動によるメモリ確保と値コピーが必要です。char_traits::copyC言語スタイルの文字列をコピーする場合にはstd::char_traits<char>::copy関数を用います。1という形で余分な長さを指定する必要があります。*)の値を返すため、これらの値をC言語の標準関数を用いてコピーすることもできます。<cstring>という形でインクルードします。メモリ解放std::strcpy関数は単純に文字列をコピーするための関数です。書き込み可能な長さを指定することができないため、利用用途によってはバッファオーバーランに注意して利用する必要があります。std::strncpy関数を用いた方法も知られていますが、扱いが難しい関数であるため注意して利用する必要があります。文字列`from`を配列`to`にコピーする。文字列`from`の長さが指定された長さ`len`よりも小さい場合には、残りの分の領域にナル文字が書き込まれる。`from`の長さが`len`以上の場合にはナル文字が追加されない点に注意が必要。char_traits::copy関数を使うと良いでしょう。basic_string::copy文字列クラスのメンバ関数copyを用いて固定長の文字列をコピーすることができます。引数に書き込み先の配列、第二引数に書き込みたい長さを指定します。'\0'}ナル文字による終端処理はされないため注意してください。第二引数に文字列長を超えた値が指定された場合には、文字列長が優先的に使用されます。メンバ関数copyでは終端ナル文字('\0')を意図的に書き込むことができません。char_traits::copyによる固定長配列への安全な書き込みコピー元の文字列長が不定な場合はバッファオーバーランに注意し、書き込み先の配列のサイズを超えない範囲で安全にコピーする必要があります。-1;}C言語の標準ライブラリ関数を用いる方法(std::memcpy)C言語の標準ライブラリ関数を用いる場合には、std::memcpy関数を利用します。char[]の時と同等の方法を用いることができます。終端ナル文字は必要に応じて手動で書き込む必要があります。'\0'}C言語の標準ライブラリ関数を用いる場合には、memcpy関数を利用します。終端ナル文字が自動で書き込まれるstrlcpy関数を用いることもできます。char添字演算子[]の利用が一番手軽ですが、空文字チェックや範囲チェックは必ず行うようにしましょう。*str.c_str()でポインタ先頭の値を取得するテクニックもあります。'\0'他にもat関数やfront関数を用いる方法がありますが、空文字時の挙動には注意が必要です(例外や未定義動作など)。参考までに、string型の変数が空文字だった場合のそれぞれの挙動をまとめておきます。char16_tchar_traits<char16_t>::copychar16_tやchar32_tの場合はchar_traits<T>::copyテンプレート関数で適切なコピーが行えます。解放マルチバイト文字列・ワイド文字列のコピーstd::u16stringのchar16_t型やstd::wstringのwchar_t型の場合は、要素型のサイズが1バイト以上になるため、strcpy関数による方法は利用できません。先程のchar_traits<char16_t>::copyやwmemcpy関数、バイト単位でのコピーに対応したmemcpy関数を使います。sizeof(char16_t)による倍数指定でのサイズ確保が必要になります。memcpy関数利用時もこの倍数指定が必要となります。