2008年10月18日土曜日

VC++で文字列のトークンを手作業で取得する(Token/Tokenize)

VC++6.0ってCStringにTokenizeという関数がないんです。

トークンというのは、指定した文字で区切られた文字列を順に取得するもの。CSVファイルの解析とかで使います。7.0以上にはあるんだけど。

ってことで、できるだけ短い処理でトークンを取得してみます。

ソース。
int idx = 0, idxOld = 0;
CString strLine = "ABC,DEF,GHI";

// 最後の1つ以外
while( ( idx = strLine.Find( ",", idxOld ) ) != -1 )
{
MessageBox( strLine.Mid( idxOld, ( idx - idxOld ) ) ) );
idxOld = idx + 1;
}
// 最後の一つ
strLine.Mid( strLine.ReverseFind( ',' ) + 1 ) );

はてしなく美しくないですが。

ただ、VC++7.0以上のTokenize関数も、連続した区切り文字(たとえば",,")を1つの区切りとして扱ってしまうので、.NETを使っていても上のような独自関数を作らないといけないことがあります。

まあ、C標準関数のstrtok(トークン取得関数)も、VC++と同じ挙動なので仕方ないのですが。

うーん。