2012-07-07 18 views
7

He estado tratando de dividir una cadena por líneas dobles ("\n\n").C++ cadena dividida por doble línea nueva

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

me da la salida

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

que obviamente no es lo que quería. Necesito conseguir algo así como

[first line 
second line] 
[third line 
fourthline] 

también he intentado boost::split pero me da el mismo resultado. ¿Qué me estoy perdiendo?

Respuesta

5

find_first_of solo busca caracteres sueltos. Lo que le está diciendo que haga pasándolo "\n\n", es encontrar el primero de '\n' o '\n', y eso es redundante. Use string::find en su lugar.

boost::split también funciona al examinar solo un carácter a la vez.

+0

inc aceptado respuesta en 8 min. muchas gracias – none

0

El motivo por el que su código no funciona está explicado muy bien por @Benjamin en su respuesta. Entonces te mostraría una solución alternativa.

No es necesario dividir manualmente. Para su caso específico, std::stringstream es apropiado:

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

salida (demo):

firstline 
secondline 
thirdline 
fourthline 
+0

esto no hace lo que OP está pidiendo, se divide 'entrada' por cada '\ n', incluso si arroja el resultado "correcto" (impreso) en este caso, debe dividirlo por dos '\norte'. –

+0

@refp: Sí hace lo que OP está pidiendo, pero de manera diferente. – Nawaz

+1

"He estado tratando de dividir una cadena por líneas dobles nuevas", en ninguna parte se divide por líneas dobles. –

1

¿Qué hay de este enfoque:

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

Me da:

[firstline 
secondline] 
[thirdline 
fourthline] 

como resultado, que es básicamente lo que querías, ¿verdad?