C++のstringクラスとは?基本的な使い方と主要な関数を解説
C++には、従来のC言語の文字列とは異なるstringクラスが用意されています。C言語の文字列は実体としてはchar型の配列ですが、C++のstringクラスはさまざまなメンバ関数を持ち、文字列操作を安全かつ簡単に行えるのが特徴です。この記事では、stringクラスの重要な機能をサンプルコードとともに紹介します。
1. stringクラスのコンストラクタ
まずは、stringクラスのコンストラクタがどのように動作するかを見ていきましょう。文字列リテラルからの初期化だけでなく、別のstringオブジェクトや文字の繰り返し、イテレータを使った初期化など、複数の方法が用意されています。
サンプルコード
#include<iostream>
using namespace std;
int main() {
string str("This is a string");
cout << "String is: " << str << endl;
string str2(str); // 別のstringオブジェクトで初期化
cout << "String is: " << str2 << endl;
string str3(5, 'A'); // 同じ文字を5回繰り返して初期化
cout << "String is: "<< str3 << endl;
string str4(str, 5, 10); // strのインデックス5から10文字分で初期化
cout << "String is: " << str4 << endl;
string str5(str.begin(), str.begin() + 7); // イテレータで先頭から7文字分を初期化
cout << "String is: " << str5 << endl;
}
実行結果
String is: This is a string String is: This is a string String is: AAAAA String is: is a strin String is: This is
このように、同じstringクラスでも状況に応じて柔軟に初期化できることがわかります。
2. stringクラスで使える演算子
次に、stringクラスでよく使われる基本演算子を確認しましょう。代表的なものは以下の3つです。
- 代入演算子(=):別の文字列をそのまま代入できる
- 連結演算子(+):2つの文字列を結合できる
- 添字演算子([ ]):指定した位置の文字にアクセスできる
サンプルコード
#include<iostream>
using namespace std;
int main() {
string str = "Hello ";
string str2 = "World";
string str3, str4;
str3 = str; // 代入演算子を使用
cout << "The value of str3: " << str3 << endl;
str4 = str + str2; // 2つの文字列を連結
cout << "The value of str4: " << str4 << endl;
cout << "Character at position 1 of str: " << str[1] << endl;
}
実行結果
The value of str3: Hello The value of str4: Hello World Character at position 1 of str: e
C言語ではstrcat()やstrcpy()などの関数が必要でしたが、stringクラスなら演算子だけで直感的に文字列操作が行えます。
3. よく使うstringクラスのメンバ関数
最後に、文字列操作で重要な役割を果たすメンバ関数を一挙に見てみましょう。以下のコードでは、クリア・長さ取得・部分文字列の検索・置換など、実務でも頻出の処理をまとめています。
サンプルコード
#include<iostream>
using namespace std;
int main() {
string str = "Hello";
cout << "String before clear: " << str << endl;
str.clear(); // 文字列を空にする
cout << "String after clear: " << str << endl;
str = "This is a string:";
cout << "length()とsize()による文字列長: " <<str.length() << " and " << str.size() << endl;
cout << "at(1)で取得した位置1の文字: " << str.at(1) << endl;
cout << "先頭の文字(front): " << str.front() << endl;
cout << "末尾の文字(back): " << str.back() << endl;
cout << "C言語形式の文字配列へ変換(c_str): " << str.c_str() << endl;
cout << "append後の文字列: " << str.append("ABCDEF") << endl;
string str2 = "ANOTHER STRING";
cout << "str2の一部を追加した後: " << str.append(str2,0, 5) << endl;
// find関数で部分文字列を検索
if (str.find("is") != string::npos)
cout << "\"is\" is found in str at " << str.find("is") << " pos" <<endl;
else
cout << "substring not found in str" << endl;
cout << "インデックス5から長さ3の部分文字列: " <<str.substr(5, 3) <<endl;
cout << "インデックス5から4文字削除した後: " <<str.erase(5, 4) << endl;
cout << "インデックス3から7文字を置換: " <<str.replace(3, 7, "C++Programming");
}
実行結果
String before clear: Hello String after clear: length()とsize()による文字列長: 17 and 17 at(1)で取得した位置1の文字: h 先頭の文字(front): T 末尾の文字(back): C言語形式の文字配列へ変換(c_str): This is a string: append後の文字列: This is a string:ABCDEF str2の一部を追加した後: This is a string:ABCDEFANOTH "is" is found in str at 2 pos インデックス5から長さ3の部分文字列: is インデックス5から4文字削除した後: This string:ABCDEFANOTH インデックス3から7文字を置換: ThiC++ Programmingng:ABCDEFANOTH
まとめ
C++のstringクラスを使えば、C言語のchar配列よりもはるかに安全で読みやすいコードを書くことができます。主なポイントは以下の通りです。
- コンストラクタを使えば、文字列リテラル・他のstring・文字の繰り返しなど多彩な方法で初期化できる
- = や + といった演算子で代入・連結が直感的に行える
- clear()、length()、find()、substr()、erase()、replace() などの豊富なメンバ関数で高度な文字列操作が可能
これらの機能を組み合わせることで、文字列処理の大部分を簡潔に実装できます。ぜひ実際にコードを書いて、stringクラスの便利さを体感してみてください。
-
C++のフレンド関数とフレンドクラスの基本を解説
C++におけるフレンド関数(friend function)とは、クラスのスコープ外で定義される関数でありながら、そのクラスのすべてのprivateメンバーおよびprotectedメンバーにアクセスする権限を持つ特別な関数です。フレンド関数のプロトタイプ(宣言)はクラス定義の中に記述しますが、あくまで「友達」として扱われるだけであり、クラスのメンバー関数にはなりません。この点は重要なポイントです。フレンドとして指定できるものフレンドとして宣言できるのは、以下のようなものです。通常の関数関数テンプレート他のクラスのメンバー関数クラス全体(この場合、そのクラスのすべてのメンバーがフレンドになります
-
C#のRegexクラスとは?主なメソッド一覧と使い方を実例付きで解説
C#のRegexクラスとはRegexクラスは、正規表現を扱うためのクラスです。正規表現とは、入力テキストとの照合(マッチング)を行うためのパターンのことであり、文字列の検索や置換、抽出などを柔軟かつ効率的に行うことができます。ここでは、Regexクラスでよく使われる主要なメソッドを紹介します。Regexクラスの主なメソッド一覧No.メソッドと説明1public bool IsMatch(string input)Regexコンストラクターで指定した正規表現が、指定された入力文字列内に一致する部分を持つかどうかを判定します。2public bool IsMatch(string input, i