Как разбирать сложную строку с С++?
Я пытаюсь понять, как я могу проанализировать эту строку, используя "sstream
" и С++
Формат его: "string, int, int".
Мне нужно назначить первую часть строки, которая содержит IP-адрес, для std::string.
Вот пример этой строки:
std::string("127.0.0.1,12,324");
Тогда мне нужно было бы получить
string someString = "127.0.0.1";
int aNumber = 12;
int bNumber = 324;
Я еще раз повторю, что я не могу использовать библиотеку boost
, просто sstream
:-)
Спасибо
Ответы
Ответ 1
Здесь полезная функция токенизации. Он не использует потоки, но может легко выполнить требуемую задачу, разделив строку на запятую. Затем вы можете делать все, что хотите, с результирующим вектором токенов.
/// String tokenizer.
///
/// A simple tokenizer - extracts a vector of tokens from a
/// string, delimited by any character in delims.
///
vector<string> tokenize(const string& str, const string& delims)
{
string::size_type start_index, end_index;
vector<string> ret;
// Skip leading delimiters, to get to the first token
start_index = str.find_first_not_of(delims);
// While found a beginning of a new token
//
while (start_index != string::npos)
{
// Find the end of this token
end_index = str.find_first_of(delims, start_index);
// If this is the end of the string
if (end_index == string::npos)
end_index = str.length();
ret.push_back(str.substr(start_index, end_index - start_index));
// Find beginning of the next token
start_index = str.find_first_not_of(delims, end_index);
}
return ret;
}
Ответ 2
С++ String Toolkit Library (Strtk) имеет следующее решение вашей проблемы:
int main()
{
std::string data("127.0.0.1,12,324");
string someString;
int aNumber;
int bNumber;
strtk::parse(data,",",someString,aNumber,bNumber);
return 0;
}
Дополнительные примеры можно найти Здесь
Ответ 3
Это не фантазия, но вы можете использовать std:: getline для разделения строки:
std::string example("127.0.0.1,12,324");
std::string temp;
std::vector<std::string> tokens;
std::istringstream buffer(example);
while (std::getline(buffer, temp, ','))
{
tokens.push_back(temp);
}
Затем вы можете извлечь необходимую информацию из каждой отдельной строки.
Ответ 4
Вы могли бы сделать что-то подобное, и я верю (полностью из головы, так извиняюсь, если я сделал некоторые ошибки там)...
stringstream myStringStream( "127.0.0.1,12,324" );
int ipa, ipb, ipc, ipd;
char ch;
int aNumber;
int bNumber;
myStringStream >> ipa >> ch >> ipb >> ch >> ipc >> ch >> ipd >> ch >> aNumber >> ch >> bNumber;
stringstream someStringStream;
someStringStream << ipa << "." << ipb << "." << ipc << "." << ipd;
string someString( someStringStream.str() );