string クラス

ここでは C++で文字列を扱うのに便利な stringクラスについて学ぶ。
※ 教科書の p.483からの「14.7 stringクラス」もよく読んで stringクラスに ついて理解を深めること。

string クラス

C++言語での文字列の扱いは、2種類の方法があり、 1つは、C言語と同様に'\0'(ナル文字)で終端する文字型の配列として扱う方法であり、 もう1つは、ここで説明する stringクラスを用いる方法である。

stringクラスは、 正確には、basic_stringという名のテンプレートクラスを、 8ビット文字列を扱うようにインスタンス化したクラスである。 日本語などのワイド文字(2バイト以上で表現される文字)での扱いを必要とする 文字列については、wstringクラスを用いるが、ここでは説明しない。

C++言語で文字列を扱う際は、C言語と同様の方式を用いてもよいが、 この stringクラスを使って扱う方がいろいろと便利なことが多い。
例えば、C言語の文字列では常に文字型配列の長さに注意を払わなければなら ないが、stringクラスでは格納する文字列の長さに応じて必要な 記憶域の大きさを自動的に調整してくれる。 また、文字列の最後に'\0'を付け忘れてプログラムが思った通りに動かないと いう事態も避けられる。 さらに、C言語の文字列では文字列のコピーや連結、内容の比較といった操作 は文字列操作ライブラリを呼び出して行なっていたが、 stringクラスでは演算子を用いるだけで簡単に実現できる。

string s("cat");                 // 初期値付き文字列
string s2;                       // 空の文字列

s2 = "dog";                      // 文字列の代入

s = s2;                          // 文字列のコピー
s2 = s1 + " and cat";            // 文字列の連結
s2 += " and mouse";              // 文字列の連結(追加)

if (s == s2)                     // 文字列の比較
    cout << "equal" << endl;

具体的な使用例を以下に示す。

  1 : //
  2 : // string test
  3 : //
  4 : #include <iostream>
  5 : #include <string>            // stringを使用する
  6 : using namespace std;
  7 : 
  8 : // 2つの文字列を比較して結果を表示する関数
  9 : void compare_string(string s, string s2)
 10 : {
 11 :     cout << "\ncompare_string:" << endl;
 12 :     cout << "s=" << s << " s2=" << s2 << endl;
 13 :     if (s == s2)             // 比較演算子 (文字列の比較)
 14 :         cout << "two strings are equal" << endl;
 15 :     else
 16 :         cout << "two strings are not equal" << endl;
 17 :         
 18 : }
 19 : 
 20 : int main()
 21 : {
 22 :     string s("one");         // "one"という内容を持つ文字列
 23 :     string s2;               // 空の文字列
 24 : 
 25 :     cout << "s=" << s << endl;
 26 : 
 27 :     s2 = s;                  // s2に sを代入
 28 :     s2 += " two";            // s2の後ろに " two"を連結
 29 :     s = "zero " + s;         // sの前に "zero "を連結
 30 : 
 31 :     cout << "s=" << s << endl;
 32 :     cout << "s2=" << s2 << endl;
 33 : 
 34 :     string s3, s4;
 35 :     s3 = "foo";
 36 :     s4 = "foo";
 37 :     compare_string(s3, s4);
 38 : 
 39 :     s4 = "bar";
 40 :     compare_string(s3, s4);
 41 : 
 42 :     return 0;
 43 : }

stringクラスを使用する場合には、stringをインクルードする 必要がある。
上記サンプルコードでは、5行目で stringをインクルードしている。

実行結果は以下の通りになる。

s=one
s=zero one
s2=one two

compare_string:
s=foo s2=foo
two strings are equal

compare_string:
s=foo s2=bar
two strings are not equal

練習問題

教科書 p.492のサンプルコード 1.から3.までの3つのプログラムを入力し、 実行せよ。


文責:大津