2012-07-07 13 views
7

Próbowałem podzielić ciąg przez podwójne znaki nowej linii ("\n\n").C++ split string by double newline

input_string = "firstline\nsecondline\n\nthirdline\nfourthline"; 

size_t current; 
size_t next = std::string::npos; 
do { 
    current = next + 1; 
    next = input_string.find_first_of("\n\n", current); 
    cout << "[" << input_string.substr(current, next - current) << "]" << endl; 
} while (next != std::string::npos); 

daje mi wyjście

[firstline] 
[secondline] 
[] 
[thirdline] 
[fourthline] 

który oczywiście nie jest to, co chciałem. Muszę coś

[first line 
second line] 
[third line 
fourthline] 

Próbowałem również boost::split ale daje mi ten sam rezultat. czego mi brakuje?

Odpowiedz

5

szuka tylko pojedynczych znaków. To, co chcesz zrobić, przekazując go pod numer "\n\n", polega na znalezieniu pierwszego z nich: '\n' lub '\n'. Jest to zbędne. Zamiast tego użyj string::find.

boost::split działa również poprzez sprawdzenie tylko jednej postaci na raz.

+0

inc zaakceptowana odpowiedź w 8 min. bardzo dziękuję – none

0

Powód, dla którego Twój kod nie działa, jest bardzo dobrze wyjaśniony przez @Benjamina w jego odpowiedzi. Więc pokażę ci alternatywne rozwiązanie.

Nie trzeba wykonywać ręcznego podziału. Dla konkretnego przypadku, std::stringstream jest właściwe:

#include <iostream> 
#include <sstream> 

int main() { 
     std::string input = "firstline\nsecondline\n\nthirdline\nfourthline"; 
     std::stringstream ss(input); 
     std::string line; 
     while(std::getline(ss, line)) 
     { 
      if(line != "") 
       std::cout << line << std::endl; 
     } 
     return 0; 
} 

wyjściowa (demo):

firstline 
secondline 
thirdline 
fourthline 
+0

to nie robi tego, o co prosi OP, dzielisz 'input' przez każdy" \ n ", nawet jeśli daje" poprawny "(wydrukowany) wynik, w tym przypadku powinieneś podzielić go na dwie części "\ n". –

+0

@refp: Robi to, co OP, ale inaczej. – Nawaz

+1

"Próbowałem podzielić ciąg przez podwójne znaki nowej linii", nigdzie nie dzieli cię podwójna linia nowego wiersza. –

1

Jak o tym podejściu:

string input_string = "firstline\nsecondline\n\nthirdline\nfourthline"; 

    size_t current = 0; 
    size_t next = std::string::npos; 
    do 
    { 
    next = input_string.find("\n\n", current); 
    cout << "[" << input_string.substr(current, next - current) << "]" << endl; 
    current = next + 2; 
    } while (next != std::string::npos); 

Daje mi:

[firstline 
secondline] 
[thirdline 
fourthline] 

jako wynik, który w zasadzie jest tym, czego chciałeś, prawda?