001
21.06.2009, 02:14 Uhr
0xdeadbeef
Gott (Operator)
|
<string.h> ist ein C-Header, der C-String-Funktionen enthält. std::string befindet sich in <string>.
Wie dem aber auch sei, eine Funktion direkt gibt es nicht, aber die ist einfach zusammengeschustert:
C++: |
#include <sstream> #include <string> #include <vector>
std::vector<std::string> explode(std::string const &line, char delim) { std::istringstream in(line); std::vector<std::string> result; std::string token;
while(std::getline(in, token, delim)) { result.push_back(token); }
return result; }
// ...
std::vector<std::string> tokens = explode("foo,bar,baz", ',');
|
Allerdings finge ich das wohl schon mit einem Parser an. Ich benutze für sowas in der Regel boost.spirit, das sieht dann etwa so aus:
C++: |
#include <boost/spirit/include/qi.hpp>
#include <algorithm> #include <iostream> #include <iterator> #include <string> #include <vector>
bool explode(std::string const &src, std::vector<int> &dest, char delim = ',') { namespace bs = boost::spirit;
std::string::const_iterator first = src.begin(), last = src.end ();
bool r = bs::qi::phrase_parse(first, last, bs::int_ % delim, dest, bs::ascii::space);
return r && first == last; }
int main() { std::vector<int> v;
if(explode("1,2,3,4,5", v)) { std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl; } else { std::cout << "Fehler!" << std::endl; } }
|
Dabei ist bs::int_ % delim die spiritisierte EBNF für von delim getrennte Ganzzahlen. Der resultierende Parser ist praktischerweise schon auf std::vector<int> attributisiert, was uns einen Haufen Arbeit erspart.
Die dahinterliegenden Konzepte sind hier: www.boost.org/doc/libs/1_39_0/libs/spirit/doc/html/spirit/qi_and_karma.html erklärt, wobei die Dokumentation für spirit2 sich leider noch im Aufbaustadium befindet. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 21.06.2009 um 02:20 Uhr von 0xdeadbeef editiert. |