C++でstd::stringをconst char*やchar*に変換する方法
この記事では、C++のstd::stringをconst char*またはchar*に変換する方法を解説します。これらは「Cスタイル文字列」と呼ばれる形式で、C言語由来のAPIやライブラリと連携する際によく必要になります。
変換にはc_str()というメンバ関数を使用します。この関数は、文字列オブジェクトの現在の値を表す、ヌル終端(null-terminated)された文字配列へのポインタを返します。
std::string::c_str() の宣言
std::string::c_strの宣言は以下の通りです。
const char* c_str() const;
この関数は、文字列オブジェクトの現在の値を表すヌル終端文字列を格納した配列へのポインタを返します。なお、処理中に例外がスローされた場合でも、元の文字列オブジェクトには一切変更が加えられません。
サンプルコード
次の例では、c_str()を使ってstd::stringをchar*配列にコピーし、さらにstrtok()関数でスペース区切りに分割して表示しています。
#include <iostream>
#include <cstring>
#include <string>
int main () {
std::string str ("Please divide this sentence into parts");
char * cstr = new char [str.length()+1];
std::strcpy (cstr, str.c_str());
char * p = std::strtok (cstr," ");
while (p!=0) {
std::cout << p << '\n';
p = std::strtok(NULL," ");
}
delete[] cstr;
return 0;
}コードのポイント
new char[str.length()+1]:ヌル終端文字分を含めたサイズでバッファを確保します。std::strcpy(cstr, str.c_str()):c_str()が返すポインタ経由で文字列をコピーします。delete[] cstr:動的に確保したメモリは必ず解放しましょう。モダンなC++ではstd::vector<char>などを使うことで、メモリ管理をより安全に行えます。
実行結果
Please divide this sentence into parts
このように、c_str()を使えばstd::stringから簡単にCスタイル文字列へ変換できます。const char*が必要な場面では直接str.c_str()を渡すだけでよく、書き込み可能なchar*が必要な場合は上記のようにコピーを作成してから利用してください。
-
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