C ++, как токенизировать эту строку? - PullRequest
4 голосов
/ 31 марта 2011

Как я могу получить строки типа «Ac milan» и «Real Madryt», если они разделены пробелами?

Вот моя попытка:

string linia = "Ac milan ; Real Madryt ; 0 ; 2";
str = new char [linia.size()+1];
strcpy(str, linia.c_str());
sscanf(str, "%s ; %s ; %d ; %d", a, b, &c, &d);

, но это неРабота;У меня есть: a= Ac; b = (null); c=0; d=2;

Ответы [ 4 ]

7 голосов
/ 31 марта 2011

Да, sscanf может делать то, что вы просите, используя преобразование набора сканирования:

#include <stdio.h>
#include <iostream>
#include <string>

int main(){ 

    char a[20], b[20];
    int c=0, d=0;
    std::string linia("Ac milan ; Real Madryt ; 0 ; 2");
    sscanf(linia.c_str(), " %19[^;]; %19[^;] ;%d ;%d", a, b, &c, &d);

    std::cout << a << "\n" << b << "\n" << c << "\n" << d << "\n";
    return 0;
}

Результат, полученный этим:

Ac milan
Real Madryt
0
2
6 голосов
/ 31 марта 2011

Если вы хотите пойти по пути C ++, вы можете использовать getline, используя ; в качестве разделителя, следующим образом.

string s = "Ac milan ; Real Madryt ; 0 ; 2";
string s0, s1;
istringstream iss(s);
getline(iss, s0, ';');
getline(iss, s1, ';');
3 голосов
/ 31 марта 2011

Похоже, у вас есть ; как символ-разделитель в строке, так что вы можете разбить строку на основе этого символа.boost::split полезно для этого:

string linia = "Ac milan ; Real Madryt ; 0 ; 2";
list<string> splitresults;

boost::split(splitresults, linia, boost::is_any_of(";"));

См. Разделение строки в C ++? , чтобы узнать о других методах разделения строк.

1 голос
/ 31 марта 2011

Вы также можете использовать метод std::string::find_first_of(), который позволяет искать символы (разделители), начиная с заданной позиции, например,

size_t tok_end = linia.find_first_of(";", prev_tok_end+1);
token = linia.substr(prev_tok_end+1, prev_tok_end+1 - tok_end);

Однако решение boost является наиболее элегантным.

...