自作strtokクラス
結構前に載せた自作Stringがたいへん不評だったね、えへへ……。
しょうこりもなく、今度は、C++のための自作strtokクラスだよ。
改編など、ご自由にどうぞ〜。
まあ、読み込みでの戻り値がboolなので、一長一短だけどね……。
・文字列の読み込みを一元化(インストラクタ or resetにて)
・連続の読み込みをwhileにて可能(成功し続ければtrue)
class StrToken { private: string _str; int _prev, _post; int _count; public: StrToken() : _str(), _prev(0), _post(0), _count(0) {} StrToken(string str) : _str(str), _prev(0), _post(0), _count(0) {} virtual ~StrToken() {} virtual void reset( // リセット string str ) { _str = str; _prev = 0; _post = 0; _count = 0; } virtual bool read( // トークン読み込み string * token, char * delimit ) { bool bl = true; _post = _str.find(delimit, _prev); if (_post != string::npos) { *token = _str.substr(_prev, _post - _prev); _prev = _post + strlen(delimit); } else if (_prev < _str.size()){ *token = _str.substr(_prev); _prev = _str.size(); } else bl = false; if (bl == true) _count++; return bl; } virtual int count() { return _count; } };
以下が、実行テスト。
void hoge( string str ) { StrToken st(str); string token; // トークン読み込みループ while (st.read(&token, "\t")) { // こうやって場合分けできるよ〜 switch (st.count()) { // ひとつめ case 1: break; // ふたつめ case 2: break; // …… default: break; } // トークンの表示テスト MessageBox(NULL, token.c_str(), "STRTOKEN TEST", MB_OK); } }