8

C++ で文字列をどのようにトークンに分割しますか?

4

6 に答える 6

15

これは私にとってはうまく機能します:)、結果は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;
}
于 2008-11-09T00:26:22.307 に答える
5

Boostを含むこのMingwディストリビューションでは:

#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"));
}
于 2008-11-09T07:13:08.850 に答える
4

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";
   }
}
于 2008-11-09T06:20:33.357 に答える
3

String Algo ライブラリの boost::split も参照してください。

string str1("こんにちは abc-*-ABC-*-aBc さようなら");
vector<string> トークン;
boost::split(tokens, str1, boost::is_any_of("-*"));
// トークン == { "こんにちは abc","ABC","aBc さようなら" }

于 2008-11-09T10:37:52.620 に答える
3

stringstream を使用してみてください:

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

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

あなたの最後の質問に対する私の答えをチェックしてください:
C++ Reading file Tokens

于 2008-11-09T00:22:23.110 に答える
1

これは、トークン区切り文字がどの程度複雑であるか、および複数ある場合によって異なります。簡単な問題の場合は、std::istringstream と std::getline を使用してください。より複雑なタスクの場合、または STL に準拠した方法でトークンを反復処理する場合は、Boost の Tokenizer を使用します。もう 1 つの可能性 (これら 2 つのどちらよりも厄介ですが) は、std::string::find を呼び出し、最後に見つかったトークンの位置を更新して、次のトークンを検索するための開始点にする while ループを設定することです。しかし、これはおそらく 3 つのオプションの中で最もバグが発生しやすいものです。

于 2008-11-09T00:21:50.663 に答える