2008-11-09 4 views
7

Как вы разбиваете строку на токены в C++?Разделение строк в C++

+0

DUP из http://stackoverflow.com/questions/236129/c-how-to-split-a-string – ididak 2008-11-09 07:07:44

+16

Как о некоторых примерах из следующих : http://www.codeproject.com/KB/recipes/Tokenizer.aspx Они очень эффективны и несколько элегантны. Библиотека String Toolkit делает сложную обработку строк на C++ простой и простой. – 2010-12-08 05:23:50

ответ

1

Это зависит от того, насколько сложным является разделитель токенов и существует ли более одного. Для простых проблем просто используйте std :: istringstream и std :: getline. Для более сложных задач или если вы хотите итерации маркеров по STL-совместимому способу, используйте Boost's Tokenizer. Другая возможность (хотя и более беспорядочная, чем любая из этих двух) заключается в создании цикла while, который вызывает std :: string :: find и обновляет позицию последнего найденного токена в качестве начальной точки для поиска следующего. Но это, вероятно, самый вероятный из 3 вариантов.

3

Попробуйте использовать stringstream:

std::string line("A line of tokens"); 
std::stringstream lineStream(line); 

std::string token; 
while(lineStream >> token) 
{ 
} 

Проверьте мой ответ на ваш последний вопрос:
C++ Reading file Tokens

12

это работает хорошо для меня :), он помещает результаты в elems. delim может быть любым char.

std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) { 
    std::stringstream ss(s); 
    std::string item; 
    while(std::getline(ss, item, delim)) { 
     elems.push_back(item); 
    } 
    return elems; 
} 
+1

Зачем возвращать элем. Когда он передается в функцию в качестве эталонного параметра? – 2008-11-09 02:47:09

2

Вы можете использовать функцию C strtok:

/* strtok example */ 
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char str[] ="- This, a sample string."; 
    char * pch; 
    printf ("Splitting string \"%s\" into tokens:\n",str); 
    pch = strtok (str," ,.-"); 
    while (pch != NULL) 
    { 
    printf ("%s\n",pch); 
    pch = strtok (NULL, " ,.-"); 
    } 
    return 0; 
} 

Boost Tokenizer будет также выполнять работу:

#include<iostream> 
#include<boost/tokenizer.hpp> 
#include<string> 

int main(){ 
    using namespace std; 
    using namespace boost; 
    string s = "This is, a test"; 
    tokenizer<> tok(s); 
    for(tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg){ 
     cout << *beg << "\n"; 
    } 
} 
5

С this Mingw distro, который включает форсиро-

#include <iostream> 
#include <string> 
#include <vector> 
#include <iterator> 
#include <ostream> 
#include <algorithm> 
#include <boost/algorithm/string.hpp> 
using namespace std; 
using namespace boost; 

int main() { 
    vector<string> v; 
    split(v, "1=2&3=4&5=6", is_any_of("=&")); 
    copy(v.begin(), v.end(), ostream_iterator<string>(cout, "\n")); 
} 
3

Смотрите также повышение :: раскол из String Algo library

 
string str1("hello abc-*-ABC-*-aBc goodbye"); 
vector<string> tokens; 
boost::split(tokens, str1, boost::is_any_of("-*")); 
// tokens == { "hello abc","ABC","aBc goodbye" }