как разбить строковое значение, содержащее символы и цифры

У меня есть std::string s=n8Name4Surname . Как я могу получить в 2 строках имя и фамилию? Спасибо

Один из способов сделать это – использовать Boost.Tokenizer . См. Этот пример:

 #include  #include  #include  int main() { using namespace std; using namespace boost; string text="n8Name4Surname."; char_separator sep("0123456789"); tokenizer > tokens(text, sep); string name, surname; int count = 0; BOOST_FOREACH(const string& s, tokens) { if(count == 1) { name = s; } if(count == 2) { surname = s; } ++count; } } 

РЕДАКТИРОВАТЬ

Если вы поместите результаты в vector , его еще меньше кода:

 #include  #include  #include  #include  #include  #include  int main() { using namespace std; using namespace boost; string text="n8Name4Surname."; char_separator sep("0123456789"); tokenizer > tokens(text, sep); vector names; tokenizer >::iterator iter = tokens.begin(); ++iter; if(iter != tokens.end()) { copy(iter, tokens.end(), back_inserter(names)); } } 

Вы можете обнаружить числовые символы в строке с помощью функции isdigit(mystring.at(position) , а затем извлечь подстроку между этими позициями.

Увидеть:

http://www.cplusplus.com/reference/clibrary/cctype/isdigit/

Используйте токенизатор Boost с цифрами 0-9 в качестве разделителей. Затем выкиньте строку, содержащую «n». Я понимаю, что это слишком много.

Простой подход STL:

 #include  #include  #include  int main() { std::string s= "n8Name4Surname"; std::vector parts; const char digits[] = "0123456789"; std::string::size_type from=0, to=std::string::npos; do { from = s.find_first_of(digits, from); if (std::string::npos != from) from = s.find_first_not_of(digits, from); if (std::string::npos != from) { to = s.find_first_of(digits, from); if (std::string::npos == to) parts.push_back(s.substr(from)); else parts.push_back(s.substr(from, to-from)); from = to; // could be npos } } while (std::string::npos != from); for (int i=0; i 

Образец обязательного увеличения духа:

 #include  #include  #include  int main() { std::string s= "n8Name4Surname"; std::string::const_iterator b(s.begin()), e(s.end()); std::string ignore, name, surname; using namespace boost::spirit::qi; rule digit = char_("0123456789"), other = (char_ - digit); if (phrase_parse(b, e, *other >> +digit >> +other >> +digit >> +other, space, ignore, ignore, name, ignore, surname)) { std::cout < < "name = " << name << std::endl; std::cout << "surname = " << surname << std::endl; } return 0; }