Хотя некоторые не считают это особенно кошерным C ++, вероятно, самый простой способ - использовать sscanf:
sscanf(A.c_str(), "tcp://%[^:]:%d", &addr, &port);
Другой возможностью было бы поместить строку в поток строк, наполнить поток фасетом, который обрабатывает большинство букв и знаков препинания как пробел, и просто прочитать адрес и порт как:
std::istringstream buffer(A);
buffer.imbue(new numeric_only);
buffer >> addr >> port;
Фаска будет выглядеть примерно так:
struct digits_only: std::ctype<char>
{
digits_only(): std::ctype<char>(get_table()) {}
static std::ctype_base::mask const* get_table()
{
// everything is white-space:
static std::vector<std::ctype_base::mask>
rc(std::ctype<char>::table_size,std::ctype_base::space);
// except digits, which are digits
std::fill(&rc['0'], &rc['9'], std::ctype_base::digit);
// and '.', which we'll call punctuation:
rc['.'] = std::ctype_base::punct;
return &rc[0];
}
};
operator>>
рассматривает пробел как разделитель между «полями», поэтому он будет обрабатывать что-то вроде 192.168.1.1:25
как две строки: «192.168.1.1» и «25».