2012-11-01 28 views
17

Dizgiyi satırlara ayırmam gerekiyor. Ben şu şekilde yapardım: ". Biz biriz \ biz nEvet"C++ satır aralığı

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

ben girişi doSegment yöntemini çağırır. Ancak hata ayıkladığımda, cümle parametresinin "biz biriz. \\ nyes olduğumuz" olduğunu ve bölümün başarısız olduğunu buldum. Birisi bana bunun neden olduğunu ve ne yapmam gerektiğini söyler mi? C++ 'da dizgiyi ayırmak için kullanabileceğim başka bir şey var mı? Teşekkürler !

+2

gösteriyor - std bir göz :: GetLink –

+1

Sen girdi hakkında bazı değişiklik yapmak gerekir var. Bölünmüş işlevi değil. – halfelf

+0

"strtok" ile dikkat edin, ona ilettiğiniz dizeyi değiştirir. –

cevap

35

std :: getline veya std :: string :: find dizgisinden geçmek için kullanmak istiyorum. kodunun altına Ben ++ gerçek c kullanarak öneririz GetLink fonksiyonunu

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

bir soru daha. Stringstream'in kapanması gerekip gerekmediğinden emin değildim. – wangzhiju

+4

yerel değişken, doSegment'ten çıkarsa kendini yok edecektir. – billz

9

Bir döngüde std::string::find numaralı telefonu arayabilir ve std::string::substr'u kullanabilirsiniz.

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

Örnek here örneğine bakın.

+3

Birden fazla karaktere sahip bir sınırlayıcı kullanıyorsanız, benim gibi olduğu gibi, "prev = pos + 1;" satır "prev = pos + delimiter.size();" yerine. Aksi takdirde, vektörteki bir sonraki öğenin başına kalan kalan karakterler kalır. –

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

Bu kod pasajı çözüm olabilir, [bir açıklama dahil] (// meta.stackexchange.com/questions/114762/explaining-entirely-‌ kod tabanlı yanıtlar) yazınızın kalitesini iyileştirmeye yardımcı olur. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerilerinizin nedenini bilmeyebileceğini unutmayın. – peacetype

+0

Aşağı kaydırırsanız, kodda yorumlar görürsünüz. Yığın Taşması, bir nedenle kod bloğu dışında metin yerleştirmeme izin vermez. – Scourge

+0

// 1) Birden çok satıra sahip bir dize var // 2) biz bunları bir diziye bölüyoruz (vektör) // 3) Bu elemanları bir for döngüsünde yazdırıyoruz – Scourge

İlgili konular