自作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);
	}
}