2012-11-01 6 views
17

私は行ごとに分割する必要があります。 は、私は次のように行うために使用:C++ split string by line

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; 
} 

I入力を "我々は一つです\我々はnyes。。" doSegmentメソッドを呼び出します。しかし、私がデバッグするとき、私は文のパラメータが "私たちは1つです。\\ nyes私たち"であり、分割が失敗したことがわかりました。誰が私にこのことが起こったのか、何をすべきか教えてくれますか?とにかくC++で文字列を分割するために使用できるものはありますか?ありがとう!

+2

のgetline機能を発揮私は本当のC++を使用することをお勧め - STDを見て:: getlineのを –

+1

あなたは、入力に関するいくつかの変更を加える必要があります。スプリット機能ではありません。 – halfelf

+0

'strtok'は、渡す文字列を変更するので注意してください。 –

答えて

35

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

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; 
} 
+0

ストリングストリームを閉じる必要があるかどうかはわかりませんでした。 – wangzhiju

+4

これはローカル変数です。doSegmentから抜けると、それ自体が破壊されます。 – billz

9

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; 
} 

hereを参照してください。

+3

複数の文字を含む区切り文字を使用している場合は、私のように、 "prev = pos + 1;"を変更する必要があります。 「prev = pos + delimiter.size();」という行に移動します。代わりに。それ以外の場合、残りの文字はベクトルの次の要素の先頭に残ります。もう一度質問があります。 –

0
#include <iostream> 
#include <string> 
#include <regex> 
#include <algorithm> 
#include <iterator> 

using namespace std; 


vector<string> splitter(string in_pattern, string& content){ 
    vector<string> split_content; 

    regex pattern(in_pattern); 
    copy(sregex_token_iterator(content.begin(), content.end(), pattern, -1), 
    sregex_token_iterator(),back_inserter(split_content)); 
    return split_content; 
} 

int main() 
{ 

    string sentence = "This is the first line\n"; 
    sentence += "This is the second line\n"; 
    sentence += "This is the third line\n"; 

    vector<string> lines = splitter(R"(\n)", sentence); 

    for (string line: lines){cout << line << endl;} 

} 

// 1) We have a string with multiple lines 
// 2) we split those into an array (vector) 
// 3) We print out those elements in a for loop 


// My Background. . . 
// github.com/Radicalware 
// Radicalware.net 
// https://www.youtube.com/channel/UCivwmYxoOdDT3GmDnD0CfQA/playlists 
+0

このコードスニペットは解決策であるかもしれませんが、[説明を含む](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)本当にあなたの投稿の質を向上させるのに役立ちます。将来読者の質問に答えていることを覚えておいてください。そうした人々はあなたのコード提案の理由を知らないかもしれません。 – peacetype

+0

下にスクロールすると、コードにコメントが表示されます。スタックオーバーフローは何らかの理由でコードブロックの外側にテキストを配置させません。 – Scourge

+0

// 1)複数行の文字列があります // 2)それらを配列(ベクトル)に分割します // 3)これらの要素をforループに出力します – Scourge