C++でstd::stringをconst char*やchar*に変換する方法
C++でstd::stringの中身をC言語形式の文字列として扱いたい場面は多くあります。読み取り専用のconst char*として取得する場合は、stringクラスが提供するc_str()メソッドを使うのが最も簡単です。一方、内容を変更できるchar*が必要な場合は、新しくメモリを確保して文字列をコピーする必要があります。
c_str()でconst char*を取得する
c_str()メソッドは、文字列の内容と終端のヌル文字('\0')を含むconst char*へのポインタを返します。元のstringオブジェクトが変更・破棄されるとポインタは無効になるため、あくまで参照用として使う点に注意してください。
サンプルコード
#include<iostream>
using namespace std;
int main() {
string x("hello");
const char* ccx = x.c_str();
cout << ccx;
}出力結果
このプログラムを実行すると、次の出力が得られます。
hello
copy関数でchar*を作成する
書き込み可能なchar*が必要な場合は、newで十分なサイズのメモリを確保し、std::copyアルゴリズムでstringの内容をコピーします。確保した領域は自動的には初期化されないため、必ず末尾にヌル文字を追加して文字列を正しく終端させることが重要です。使い終わったらdelete[]でメモリを解放することも忘れないようにしましょう。
サンプルコード
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
string x("hello");
// 必要なメモリを確保(+1は終端のヌル文字分)
char* ccx = new char[x.length() + 1];
// 文字列の内容をコピー
std::copy(x.begin(), x.end(), ccx);
ccx[x.length()] = '\0'; // 終端のヌル文字を追加
cout << ccx;
// メモリを解放
delete[] ccx;
}出力結果
このプログラムを実行すると、次の出力が得られます。
hello
まとめ
読み取り専用ならc_str()一択です。内容を書き換えたい場合のみ、メモリ確保とコピーを行いましょう。また、C++11以降ではx.data()や範囲for文なども活用でき、状況に応じて適切な方法を選ぶことが大切です。
-
C++でCSVファイルを読み込み・解析する2つの方法を解説
C++でCSVファイルを解析する場合、自分でファイルを読み込んで処理するよりも、ライブラリを利用することを強くおすすめします。CSVは一見単純な形式に見えますが、引用符で囲まれたカンマやエスケープ処理など、考慮すべきケースが数多く存在します。自前で実装すると、こうしたエッジケースを見落としてしまう可能性が高くなります。 C++向けのBoostライブラリには、CSVファイルを読み込むための便利なツールセットが用意されています。 Boost.Tokenizerを使った解析方法 以下は、Boostのtokenizerとescaped_list_separatorを使用して、1行のCSVデータを解析す
-
C#でリスト(List)を文字列に変換する方法をわかりやすく解説
C#では、string.Joinメソッドを使うことで、リスト(List)の要素を簡単にひとつの文字列に結合できます。ここでは、基本的な手順とサンプルコードを紹介します。 手順1:リストを宣言する まず、文字列型のリストを宣言します。 List<string> l = new List<string>(); 手順2:リストに要素を追加する 次に、Addメソッドを使ってリストに要素を追加していきます。 // 要素の追加 l.Add(Accessories); l.Add(Footwear); l.Add(Watches); 手順3:リストを文字列に変換する string.J