2012-07-07 14 views
7

Ho cercato di dividere una stringa con double newlines ("\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); 

mi dà l'uscita

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

che ovviamente non è quello che volevo. Ho bisogno di ottenere qualcosa di simile

[first line 
second line] 
[third line 
fourthline] 

Ho anche provato boost::split ma mi dà lo stesso risultato. Cosa mi manca?

risposta

5

find_first_of cerca solo caratteri singoli. Quello che stai dicendo di fare passandolo a "\n\n", è quello di trovare il primo di '\n' o '\n', e questo è ridondante. Utilizzare invece string::find.

boost::split funziona anche esaminando un solo carattere alla volta.

+0

risposta accettata in 8 min. grazie mille – none

0

Il motivo per cui il codice non funziona è spiegato molto bene da @Benjamin nella sua risposta. Quindi ti mostrerei una soluzione alternativa.

Non è necessario eseguire la divisione manuale. Per il vostro caso specifico, std::stringstream è appropriato:

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

uscita (demo):

firstline 
secondline 
thirdline 
fourthline 
+0

questo non fa quello che l'OP sta chiedendo, dividi "input" ogni singolo "\ n", anche se produce il risultato "corretto" (stampato) in questo caso dovresti dividerlo per due '\ n'. –

+0

@refp: Fa ciò che l'OP sta chiedendo, ma in modo diverso. – Nawaz

+1

"Ho cercato di dividere una stringa per doppia riga nuova", da nessuna parte si sta dividendo con doppie nuove. –

1

Che ne dite di questo approccio:

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

Mi dà:

[firstline 
secondline] 
[thirdline 
fourthline] 

come risultato, che è fondamentalmente quello che volevi, giusto?