[C++/STL] std::stringクラスの使い方

std::stringはC++標準ライブラリ(STL)の文字列クラスです。char型の配列を使うよりとっても便利になりました。メモリのalloc/freeを自動でやってくれます。

ここでは、よく使う機能に絞って説明します。より詳しく知りたい人はcpprefjpで勉強することをお勧めします。

スポンサーリンク

インクルードヘッダ

stringヘッダをインクルードすると使えるようになります。

#include <string>

宣言

stringクラスはstd名前空間で定義されているのでstd::stringと宣言する必要があります。次の2つの方法でstd::を省略して書くことができます。

using namespace std;	// ヘッダやファイルの先頭にこれを書くのはあまりお行儀がよくない。std配下の全てのクラスを使用すると言っているようなもの。
using std::string;		// 使用するクラスを限定するために、なるべくこちらを使用しましょう。

以降のサンプルコードはincludeとusing宣言をしたものとします。

初期化

char[]と同じように宣言時の代入で書くことができます。引数にも初期値を書けます。

使用例:

int main(void)
{
	string str1 = "コッコ隊長の";
	string str2("勉強部屋");

	cout << str1 << str2 << endl;
	
	return 0;
}

実行結果:

コッコ隊長の勉強部屋

文字列のコピー

代入演算子でコピーできます。

使用例:

int main(void)
{
	string str1 = "コッコ隊長の勉強部屋";
	string str2;

	str2 = str1;

	cout << str2 << endl;
	
	return 0;
}

実行結果:

コッコ隊長の勉強部屋

文字列のクリア(clear)

メンバ関数”clear”を使ってクリアできます。

使用例:

int main(void)
{
	string str1 = "コッコ隊長の勉強部屋";

	str1.clear();

	cout << str1 << endl;

	return 0;
}

実行結果:

文字列が一致しているかどうか

比較演算子”==”または”!=”で一致しているかどうかを判定できます。

使用例:

int main(void)
{
	string str1 = "コッコ隊長";
	string str2 = "コッコ隊長";

	if(str1 == str2){
		cout << "str1とstr2は一致しているよ" << endl;
	}else{
		cout << "str1とstr2は不一致だよ" << endl;
	}

	if(str1 != "コッコ隊副隊長"){
		cout << "str1はコッコ隊副隊長じゃないよ" << endl;
	}else{
		cout << "str1はコッコ隊副隊長だよ" << endl;
	}
	
	return 0;
}

実行結果:

str1とstr2は一致しているよ
str1はコッコ隊副隊長じゃないよ

文字列が空(カラ)かどうか(empty)

メンバ関数”empty”でカラかどうかを判定できます。戻り値はbool。trueのときがカラ。

使用例:

int main(void)
{
	string str1;

	if(str1.empty()){
		cout << "str1はカラ" << endl;
	}else{
		cout << "str1はカラじゃない" << endl;
	}

	// size==0でもOK。
	if(str1.size() == 0){
		cout << "str1はカラ" << endl;
	}else{
		cout << "str1はカラじゃない" << endl;
	}

	// == ""でもOK。
	if (str1 == ""){
		cout << "str1はカラ" << endl;
	}else{
		cout << "str1はカラじゃない" << endl;
	}

	return 0;
}

実行結果:

str1はカラ
str1はカラ
str1はカラ

文字列のサイズ(長さ)を取得(size、length)

メンバ関数”size”または”length”で文字列のサイズを取得することができます。どちらを使っても同じ。文字列のサイズ==文字数ではないから気をつけてください。

使用例:

int main(void)
{
	string str1 = "コッコ隊長の勉強部屋";

	cout << str1.size() << endl;

	return 0;
}

実行結果:

20

n番目の文字にアクセス

配列と同じように”[n]”でアクセスできます。

使用例:

int main(void)
{
	string str1 = "ABCDEFG";

	cout << str1[5] << endl;

	return 0;
}

実行結果:

F

n番目の文字を削除(erase)

メンバ関数”erase”を使って文字を削除することができます。引数はイテレータになります。引数を整数値で書くとn番目以降の文字をすべて削除します。

使用例:

int main(void)
{
	string str1 = "ABCDEFG";

	str1.erase(str1.begin()+5);

	cout << str1 << endl;

	return 0;
}

実行結果:

ABCDEG

文字列の連結

“+”または”+=”演算子で連結できます。文字列バッファが足りなくなると自動的にreallocしてくれます。(便利!)

使用例:

int main(void)
{
	string str1 = "コッコ隊長の";
	string str2 = "勉強部屋";

	str1 += str2;

	cout << str1 << endl;
	
	return 0;
}

実行結果:

コッコ隊長の勉強部屋

文字列の挿入(insert)

メンバ関数”insert”を使って挿入できます。いろんなバリエーションがあります。詳しくはここを参照してください。

使用例:

int main(void)
{
	string str1 = "コッコ隊長の勉強部屋";

	//          ↓挿入位置
	str1.insert(12, "C++");
	//              ↑挿入文字列

	cout << str1 << endl;
	
	return 0;
}

実行結果:

コッコ隊長のC++勉強部屋

文字列の置換(replace)

メンバ関数”replace”を使って置換することができます。 いろんなバリエーションがあります。詳しくはここを参照してください。

使用例:

int main(void)
{
	string str1 = "コッコ隊長の勉強部屋";

	//           ↓置換開始位置  ↓置換文字列
	str1.replace(12, 4, "プログラミング");
	//               ↑置換文字数

	cout << str1 << endl;
	
	return 0;
}

実行結果:

コッコ隊長のプログラミング部屋

部分文字列の取り出し(substr)

メンバ関数”substr”を使って文字列を部分的に取り出すことができます。戻り値はstring。 いろんなバリエーションがあります。詳しくはここを参照してください。

使用例:

int main(void)
{
	string str1 = "コッコ隊長の勉強部屋";

	cout << str1.substr(12, 4) << endl;
	
	return 0;
}

実行結果:

勉強

文字列の検索(find、rfind)

メンバ関数”find”または”rfind”を使って検索することができます。findは文字列の最初から、rfindは文字列の最後から検索します。戻り値はstringクラスで定義されているsize_typeという型。見つからなかった場合はnposという値が返されます。

使用例:

int main(void)
{
	string str1 = "コッコ隊長の勉強部屋";

	string::size_type pos = str1.find("隊長");
	if(pos == string::npos){
		cout << "隊長 は含まれないよ" << endl;
	}else{
		cout << "隊長 が含まれているよ" << endl;
	}

	return 0;
}

実行結果:

隊長 が含まれているよ

挿入(insert)や置換(replace)と組み合わせて使うことができます。

使用例:

int main(void)
{
	string str1 = "コッコ隊長の勉強部屋";

	str1.insert(str1.find("勉強"), "C++");

	cout << str1 << endl;

	return 0;
}

実行結果:

コッコ隊長のC++勉強部屋

以上がstringクラスの基本的な使い方になります。C言語と比べるとメモリ管理がなくなり、よく使う処理がメンバ関数として用意されていて、すごく便利になりました。使いこなせるように頑張りましょう!!

コメント