41

文字列を行ごとに分割する必要があります。以前は次の方法で行っていました。

int doSegment(char *sentence, int segNum)
{
assert(pSegmenter != NULL);
Logger &log = Logger::getLogger();
char delims[] = "\n";
char *line = NULL;
if (sentence != NULL)
{
    line = strtok(sentence, delims);
    while(line != NULL)
    {
        cout << line << endl;
        line = strtok(NULL, delims);
    }
}
else
{
    log.error("....");
}
return 0;
}

「私たちは一つです。\はい、私たちはそうです」と入力します。doSegment メソッドを呼び出します。しかし、デバッグすると、文のパラメーターが「we are one.\\nyes we are」であることがわかり、分割に失敗しました。なぜこれが起こったのか、どうすればよいのか誰か教えてください。C++で文字列を分割するために使用できる方法は他にありますか? ありがとう !

4

5 に答える 5

75

std::getline または std::string::find を使用して文字列を調べたいと思います。以下のコードは getline 関数を示しています

int doSegment(char *sentence)
{
  std::stringstream ss(sentence);
  std::string to;

  if (sentence != NULL)
  {
    while(std::getline(ss,to,'\n')){
      cout << to <<endl;
    }
  }

return 0;
}
于 2012-11-01T07:14:33.253 に答える
17

std::string::findループで呼び出すことができ、を使用できますstd::string::substr

std::vector<std::string> split_string(const std::string& str,
                                      const std::string& delimiter)
{
    std::vector<std::string> strings;

    std::string::size_type pos = 0;
    std::string::size_type prev = 0;
    while ((pos = str.find(delimiter, prev)) != std::string::npos)
    {
        strings.push_back(str.substr(prev, pos - prev));
        prev = pos + 1;
    }

    // To get the last substring (or only, if delimiter is not found)
    strings.push_back(str.substr(prev));

    return strings;
}

こちらの例をご覧ください。

于 2012-11-01T07:08:17.420 に答える