
17.02.2008, 05:23
|
|
Banned
Регистрация: 18.05.2005
Сообщений: 1,981
Провел на форуме: 1941233
Репутация:
2726
|
|
Код:
// ...
class Tokenize
{
public:
void Reset()
{
m_Pos = m_Source;
}
Tokenize(const char * Src,const char * Tokens = "|")
{
m_Pos = m_Source = strdup(Src);
m_End = m_Pos+strlen(m_Pos);
mg_Ret = 0;
m_Tokens = strdup(Tokens);
}
~Tokenize()
{
delete m_Source;
if (m_Tokens)
delete m_Tokens;
if (mg_Ret)
delete mg_Ret;
}
const char * GetNextToken()
{
if (mg_Ret)
{
delete mg_Ret;
mg_Ret = 0;
}
if (!*m_Pos)
return 0;
if (m_Tokens)
{
const char * nextpos = token_first();
unsigned curlen = (unsigned)(nextpos - m_Pos + 1);
mg_Ret = (char*)malloc(curlen);
lstrcpyn(mg_Ret,m_Pos,curlen);
m_Pos = nextpos;
if (m_Pos[0]) ++m_Pos;
}
return mg_Ret;
}
private:
const char * m_Pos, * m_Tokens, * m_Source, * m_End;
char * mg_Ret;
const char * token_first()
{
unsigned i = 0;
char c;
const char * m = m_End;
while (c=m_Tokens[i++])
{
char * d = strchr(m_Pos,c);
if (d && d < m)
m = d;
}
return m;
}
};
// ...
int main()
{
Tokenize tok("abc|def|ghi.sex.dax/big/min",".|/");
const char * part;
while (part = tok.GetNextToken())
{
MessageBox(0, part, "Tokenize 1", MB_ICONEXCLAMATION);
}
tok.Reset();
while (part = tok.GetNextToken())
{
MessageBox(0, part, "Tokenize 2", MB_ICONINFORMATION);
}
return 0;
}
// ...
|
|
|