format_list_bulleted
【C++】C++の文字列操作(std::stringクラス)について解説
最終更新日時:2020-05-23 07:03:40



AtCoderやPaizaなどの競技プログラミングでは、文字列の操作に関する問題が多く掲載されています。そこで、本記事ではC++での文字列処理ができる、std::stringクラスについて解説します。

C++のstd::string とは

C++では、文字列を扱うための変数として、std::stringクラスが用意されています。std::stringクラスを用いることで、string型(文字列型)の宣言だけでなく、文字列の長さを取得できたり、文字の挿入削除などもできます。

std::stringの基本的な使い方

ここでは、std::stringの基本的な使い方として、文字列の代入から、出力までの一連の流れを説明します。

説明に使うコード

ここでは、以下のコードを例として説明します。

タイトル:sample.cpp

#include<iostream>
#include<string> //stringクラスを使用可能にする
using namespace std; 

int main() {
  string str = "Code Database"; //宣言・代入
  cout << str << endl; //出力
}

はじめに(インクルード)

文字列処理ができる、std::stringクラスを取り扱うには、#include<string>します。コードの冒頭でusing namespace std;と宣言することで、main関数中でstd::の記述を省略することができます。

#include<iostream>
#include<string> //stringクラスを使用可能にする
using namespace std; 

宣言・出力

文字列の型を宣言するには以下のようにstring strと記述します。

また、文字列を代入するためには、代入したい文字列にシングルクォーテーション(‘’)またはダブルクォーテーション(“”)で値を囲むことが必要です。

string str = "Code Database"; //宣言・代入

では、実際に出力してみましょう。以下のコードを用いるとCode Databaseと出力されるはずです。

  cout << str << endl; //出力

文字列の内容を取得について

文字数の取得(size())

文字列の長さを取得したい場合、size()で取得することができます。

タイトル:string_length.cpp

#include<iostream>
#include<string>
using namespace std;

int main() {
  string str1 = "Code Database";
  string str2 = "Code";
  cout << str1 << endl; 
  cout << str2 << endl; 
  cout << str1.size() << endl;
  cout << str2.size() << endl;
  cout << str1.length() << endl;
  cout << str2.length() << endl;
}

タイトル:result

Code Database
Code
13
4
13
4

文字列が空かどうか調べる(empty())

文字列が空かどうか判定したい場合、empty()を用いて判別することができます。

またこの時、空である時は"1"、空でない時は"0"を返します。

タイトル:empty.cpp

#include<iostream>
#include<string>
using namespace std;

int main() {
  string str1 = "Code Database";
  string str2 = "";
  cout << str1 << endl; 
  cout << str2 << endl; 
  cout << str1.empty() << endl;
  cout << str2.empty() << endl;
}

タイトル:result

Code Database

0
1

文字の検索(find())

ある文字列から検索したい文字列がある時は、find()を使います。

以下のコードのように、"Code Database"からfind()を使って、"D"の文字を検索するとき、先頭を0として数えた"D"の位置(5)になります。また、文字列が見つからなかった場合、"18446744073709551615"という数字が出てきますがこれはstring::nposという値になります。

タイトル:string_find.cpp

#include<iostream>
#include<string>
using namespace std;

int main() {
  string str1 = "Code Database";
  string str2 = "Code";  
  cout << str1.find("D") << endl;
  cout << str1.find("F") << endl;
  cout << (str1.find("F") == string::npos) << endl;
}

タイトル:result

5
18446744073709551615
1


文字列の基本的な編集について

文字列の連結(+)

文字列の連結に足し算のように+でつなげることができます。

タイトル:string_plus.cpp

#include<iostream>
#include<string>
using namespace std;

int main() {
  string str1 = "Code";
  string str2 = "Database";  
  cout << str1+str2 << endl;
}

タイトル:result

CodeDatabase

文字列の分割(substr())

文字列を分割する場合、substr()を使います。

またsubstr(x)としたとき、x番目以降の文字列を取り出すことができます。

またsubstr(x,y)としたとき、x番目以降のy文字分取り出すことができます。

また、substr()find()と組み合わせて文字の位置を検索し、分割することもできます。

タイトル:string_substr.cpp

#include<iostream>
#include<string>
using namespace std;

int main() {
  string str1 = "Code Database";
  cout << str1.substr(5) << endl;
  cout << str1.substr(str1.find("D")) << endl;
  cout << str1.substr(5,3) << endl;
}

タイトル:result

Database
Database
Dat

文字列の削除(erase())

文字列を削除する場合、erase()を使います。

またerase(x)としたとき、x番目以降の文字列を削除することができます。

またerase(x,y)としたとき、x番目以降のy文字分削除することができます。

また、erase()find()と組み合わせて文字の位置を検索し、分割することもできます。

タイトル:string_erase.cpp

#include<iostream>
#include<string>
using namespace std;

int main() {
  string str1 = "Code Database";
  string str2 = str1.erase(5);
  str1 = "Code Database";
  string str3 = str1.erase(str1.find("D"));
  str1 = "Code Database";
  string str4 = str1.erase(5,2);
  cout << str2 << endl;
  cout << str3 << endl;
  cout << str4 << endl;
}

タイトル:result

Code 
Code 
Code tabase

文字列の挿入(insert())

文字列を挿入する場合、insert()を使います。

またinsert(x,y)としたとき、x番目の文字の前に文字列yを挿入することができます。

また、insert()find()と組み合わせて文字の位置(x)を検索し、x番目に挿入することもできます。

タイトル:string_insert.cpp

#include<iostream>
#include<string>
using namespace std;

int main() {
  string str1 = "Code";
  string str2 = str1.insert(4,"Database");
  str1 = "Code";
  string str3 = str1.insert(str1.find("e")+1,"Database");

  cout << str2 << endl;
  cout << str3 << endl;
}

タイトル:result

CodeDatabase
CodeDatabase

文字列の置換(replace())

文字列を置換する場合、replace()を使います。

また、replace(x,y,z)としたとき、x番目からy文字分の文字列をzに置換します。

タイトル:string_replace.cpp

#include<iostream>
#include<string>
using namespace std;

int main() {
  string str1 = "Code Database";
  string str2 = str1.replace(5,4,"X");
  cout << str2 << endl;
}

タイトル:result

Code Xbase

まとめ

本記事ではC++のstd::stringの基本的な使い方を紹介しました。最後に要点をまとめます。

  • std::stringクラスを用いることで、文字列を扱うことができる
  • 文字列の宣言だけでなく、文字列の長さを取得できたり、文字の挿入削除などもできる

皆さんもぜひ文字列を活用しましょう!!