DESC
c++ 標準ライブラリとして用意されている。
C-String と比較して次のメリットがある
安全性: 配列境界を超えない
利便性: 標準C++ 演算子の使用が可能
一貫性: 文字列という型を定義できる
sizeof( string ) = 4;
文字列を格納する際に, new, delete をしている
string 型は クラステンプレート basic_string の実装のひとつ
typedef basic_string< char, char_traits< char>, allocator< char> > string;
// 空 string
string();
// C_String str を使用して生成
string( const char *str );
// 他のstringを使用して string 生成
string(const string &str);
演算子
+
string + string
string + c_str
c_str + string
c_str + string
// Compile ERROR にならないが "7" は追加されない
string s;
s += 7;
■ 結合
string s;
s += "a" ;
s += "b" ;
s += "c" ;
// "abc"
printf( "%s" , s.c_str() );
s[1] = '\0';
// "a"
printf( "%s" , s.c_str() );
■ 文字数
SYNTAX
size_type size();
// 3
string s = "abc" ;
s.size();
■ 参照
// 参照
char operator[]( idx );
■ 検索
SYNTAX
size_type find(
const string &str, size // 検索する文字列
_type pos = 0 // 検索を開始するオフセット
);
RET
N : 見つかったインデックス位置
string::npos : 見つからない
// 検索
if ( s.find( "abc" ) != string::npos ) {
}
// 後ろから検索
s.rfind( "abc" );
if ( string1 == string2 ){}
string1 = string2; // string を代入
string1 = "foobar\n" ; // C_string を代入
パスからファイル名をかえす。
string filename( const string &path )
{
size_t i = path.find_last_of("/" );
string ret = path.substr(i+1, path.length());
return ret;
}
string dirname( const string &path )
{
size_t i = path.find_last_of("/" );
string ret = path.substr(0, i);
return ret;
}
■ 部分文字列
substr
SYNTAX
basic_string substr(size_type pos = 0, size_type n = nr) const;
DESC
pos で指定した index から n 個の文字列を返す。
assign ( 部分列. )
str から、pos文字目から、n文字を取り出して設定
assign( const basic_string& str, size_type pos = 0, size_type n = npos );
■ 比較
compare ( 比較 )
// 文字列定数sのn文字までとの比較を行う。
int compare(const char* s, size_type pos, size_type n) const;
string s = "foo bar g" ;
// 3
int nr = s.find(" " );
// 7
int nr = s.rfind(" " );
// 0 番目から 3 個
// foo
s.substr( 0, 3 );
// 見つからない場合は, -1
int nr = s.rfind("foo" );
POINT
string class はコンテナ
∴ 文字列の先頭、末尾を指す、begin(), end(), size() をサポート
static にした場合は, Compiler 単位で作成されるので重複してしまう.
// foo.h 重複しない.
extern const char *strtbl[];
// foo.cpp
const char *strtbl[] = {
"a" ,
"b" ,
"c" ,
};
// foo.h -> 重複する.
static const char *strtbl[] = {
"a" ,
"b" ,
"c" ,
};