Как разобрать сложную строку с C ++? - PullRequest
12 голосов
/ 15 января 2010

Я пытаюсь понять, как я могу разобрать эту строку, используя "sstream" и C ++

Формат этого: "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 :-)

Спасибо

Ответы [ 4 ]

13 голосов
/ 15 января 2010

Библиотека C ++ String Toolkit (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;
}

Больше примеров можно найти Здесь

6 голосов
/ 15 января 2010

Это не причудливо, но вы можете использовать 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);
}

Затем вы можете извлечь необходимую информацию из каждой из разделенных строк.

3 голосов
/ 15 января 2010

Вот полезная функция токенизации. Он не использует потоки, но может легко выполнить требуемую задачу, разбив строку на запятые. Затем вы можете делать что угодно с результирующим вектором токенов.

/// 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 голосов
/ 15 января 2010

Полагаю, вы могли бы сделать что-то вроде этого (Полностью вне моей головы, поэтому извиняюсь, если я допустил некоторые ошибки) ...

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() );
...