На счёт "лучше всего" - вопрос не ко мне. Но я вот как делаю на примере с++ билдера:

//функция
TStringList* SplitString(const String s, const char *razd) {
TStringList *list = new TStringList();
if(razd == NULL) {//если разделители не указаны, то возвращаем исходную строку
list->Add(s);
return list;
}
int len = s.Length();
String tmp = "";
bool bRazd;
//пробегаем побуквенно по строке
for(int k=1;k<=len;++k) {
bRazd = false;
for(int j=0;razd[j] != NULL;++j) {//проверка не является ли текущий символ разделителем
if(s[k] == razd[j]) {
bRazd = true;
break;
}
}
if(bRazd == true && tmp != "") { //если разделитель, то предыдущее набранное из букв слово добавляем в список
list->Add(tmp);
tmp = "";
}
else { //иначе набираем слово побуквенно
tmp += s[k];
}
if(k == len && tmp != "") //если достигли последнего символа, то последнее слово тоже в список добавляем
list->Add(tmp);
}
return list;
}
//использоваие
String s = "man{1,2,3,4}";
char razd[] = {'{','}',',',' '};
TStringList *lst = fnSplitString(s, razd);
for(int k=0;k<lst->Count;++k) {
ShowMessage(lst->Strings[k]);
}
delete lst; //необязательно, должно удалиться при выходе из области видимости