18.1 string型の役目
省略
18.2 basic_strinクラス
/* basic_stringの内容 */
省略
/* string型で特定する */
省略
18.3 string型の初期化と演算子
/* string型の初期化 */
/* string型の配列 */
string ss1[2];
string ss2[4] = { "aaaa", "bbbb", "cccc", "dddd" };
string ss3[4] = { "eeee", "ffff", "gggg" };
string ss4[] = { "iiii", "jjjj", "kkkk", "llll" };
/* string型対応の演算子 */
省略
/* 演算の作用対象 */
省略
/* 非string型だけの演算 */
string s1, s2 = "xxx";
s1 = "aaa" + "bbb; // エラー(非string要素のみではできない)
s1 = s2 + "aaa" + "bbb"; // 正しい
s1 = "aaa" + "bbb" + s2; // エラー(先頭2要素がstring型でない)
s1 = s2 + "aaa" + "bbb" + "ccc"; // 正しい
/* char型配列への代入 */
s1 = cc; // OK。string型=char[]型
strcpy(cc, s1); // エラー。strcpy()関数はchar*型を要求する
strcpy(cc, s1.c_str()); // OK。s1.c_str()はC文字列を返す
/* 添字処理 */
string s1 = "ABCDE";
char ch;
ch = s1[2]; // chは'C';
s1[3] = 'Z'; // s1は"ABCZE"
/* 文字の代入 */
string s1 = 'A'; // エラー
18.4 stringクラスのメンバ関数
/* size_typeとnpos定数 */
s1.assign(s2, 4, string::npos); // s1にs2の4番目以降の全文字を設定
ある処理系ではnposの値は次のようになります。
string::size_type n1 = string::npos; // n1は4294967295
unsigned int n2 = string::npos; // n2は4294967295
int n3 = string::npos; // n3は-1
/* string文字列とCスタイル文字列 */
string文字列をCスタイル文字列として使用するためのサービス関数として、
c_str() // char配列を作成し、末尾に'0'を追加
data() // char配列を作成
copy() // Cスタイル文字列としてコピーする
char cc[80]; // char配列
string ss = "ABCDE"; // stringオブジェクト
const char *p; // constに注意
p = ss.c_str(); // Cスタイル文字列の先頭アドレスを設定する
strcpy(cc, ss.c_str()); // Cスタイル文字列をコピーする
cout << p << 'n';
cout << cc << 'n';
またdata()関数を使って、個別要素を指定したいときは次のようにします。
p = ss.data();
cout << *p << 'n';
cout << *(p+1) << 'n';
取り出すデータはconst付きポインタで受け取ります。
これは、一時生成された配列内容を変更することはできないことを意味しています。
ss.copy(cc, 3);
cc[3] = '0';
cout << cc << 'n';
コピー文字数指定が現在の文字列長より大きいときは、全文字列をコピーしてくれます。
したがって全文字列取り出しは次のように記述できます。
ss.copy(cc, string::npos);
cc[ss.length()] = '0';
cout << cc << '0';
/* stringオブジェクトのサイズ */
string ss = "ABCDEF";
cout << ss.length() << 'n'; // 6
cout << ss.size() << 'n'; // 6
length()とsize()は同義語。
cout << ss.max_size() << 'n'; // 4294967294
cout << ss.capacity() << 'n'; // 15(実際に確保されている領域サイズ
ss.resize(10, ' ');
cout << ss.size() << 'n'; // 10(文字列を10にする。長くなる場合は空白が入る)
ss.reserve(80);
cout << ss.capacity() << 'n'; // 95(実際に確保されている領域サイズを設定する)
/* stringクラスのメンバ関数の用法 */
省略
/* stringクラスのメンバ関数を使う */
省略