第 1 章: string

string とは

C++ 言語では string というものは, basic_string テンプレートであるので, 厳密にはクラスではない:

typedef basic_string<char> string;

基本操作 1

basic_str.cpp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string>

using namespace std;

int main(){

  string str1; // 空きの string
  string str2("wtopia"); // 初期値としての "wtopia"

  cout << str1 << endl;
  cout << str2 << endl;

  str1 = str2; // str2 の内容を str1 に代入
  cout << str1 << endl;
  
  return 0;
}

上記プログラムの実行結果は:

[wtopia cpp.stl]$ g++ -Wall -O2 -o basic_str basic_str.cpp
[wtopia cpp.stl]$ ./basic_str

wtopia
wtopia

基本操作 2

basic_str2.cpp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>

int main(){
  using namespace std;

  string str1("I love ");
  string str2("you");

  str1 += str2; // str1 の末尾に str2 を連結
  cout << str1 << endl;

  if ( str1 == "I love you") // 二つの文字列を比較
    cout << "一致" << endl;
  else
    cout << "不一致" << endl;

  cout << "str1 の文字数は" << str1.size() << endl; // 文字列の長さを出力

  return 0;
}

上記プログラムの実行結果は:

[wtopia cpp.stl]$ g++ -Wall -O2 -o basic_str2 basic_str2.cpp
[wtopia cpp.stl]$ ./basic_str2
I love you
一致
str1 の文字数は10

従来の文字列への変換

注意:

string 型で管理している文字列を char * 型を要求する関数に渡すような場合, c_str() というメンバ関数を使うこと.

c_str.cpp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include <iostream>
#include <string>

int main(){
  using namespace std;

  string filename( "test.txt" );

  FILE *fp = fopen( filename.c_str(), "r" );

  fclose( fp ) ;

  return 0;
}

要素の直接アクセス

str_access.cpp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <iostream>
#include <string>

int main(){
  using namespace std;

  string str("wtopia");

  str[0] = 'A';
  str[1] = 'B';

  cout << str << endl;

  return 0;
}

上記プログラムの実行結果は:

[wtopia cpp.stl]$ g++ -Wall -O2 -o str_access str_access.cpp
[wtopia cpp.stl]$ ./str_access
ABopia

部分文字列

substr.cpp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <iostream>
#include <string>

int main(){
  using namespace std;

  string str1("wtopia");

  string str2 =  str1.substr(3); // pia
  string str3 = str1.substr(0, 3); // wto

  cout << str1 << endl;
  cout << str2 << endl;
  cout << str3 << endl;

  return 0;
}

上記プログラムの実行結果は:

[wtopia cpp.stl]$ g++ -Wall -O2 -o substr substr.cpp
[wtopia cpp.stl]$ ./substr
wtopia
pia
wto

検索

文字列中から, 目的文字列を探すことができる.

文字列検索用の関数は 6 種類がある:

1. find() -> 指定した文字列が, 最初に現れる位置を返す
2. rfind() -> 指定した文字列が, 最後に現れる位置を返す
3. find_first_of() -> 指定した文字列の一部の文字が, 最初に現れる位置を返す
4. find_last_of() -> 指定した文字列の一部の文字が, 最後に現れる位置を返す
5. find_first_not_of() -> 指定した文字列の一部に含まれない文字が, 最初に現れる位置を返す
6. find_last_not_of() -> 指定した文字列の一部に含まれない文字が, 最後に現れる位置を返す

str_find.cpp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <iostream>
#include <string>

int main(){
  using namespace std;

  string str("faadflasdfkasdfjljkjla1skwt");

  string::size_type index = str.find("as"); // "as" を検索
  
  if(index == string::npos)
    cout << "検索に失敗した" << endl;
  else
    cout << str.substr(index) << endl;

  return 0;
}

上記プログラムの実行結果は:

[wtopia cpp.stl]$ g++ -Wall -O2 -o str_find str_find.cpp
[wtopia cpp.stl]$ ./str_find
asdfkasdfjljkjla1skwt