2012-07-07 28 views
7

Tôi đã cố gắng chia chuỗi bằng dòng mới đôi ("\n\n").c + + chia chuỗi bằng đường đôi mới

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

mang lại cho tôi kết quả

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

mà rõ ràng là không phải những gì tôi muốn. Tôi cần nhận được một số thông tin như

[first line 
second line] 
[third line 
fourthline] 

Tôi cũng đã thử boost::split nhưng nó cũng mang lại kết quả tương tự. Tôi đang thiếu gì?

Trả lời

5

find_first_of chỉ tìm kiếm các ký tự đơn. Những gì bạn đang nói nó làm bằng cách vượt qua nó "\n\n", là để tìm đầu tiên của '\n' hoặc '\n', và đó là dư thừa. Sử dụng string::find để thay thế.

boost::split cũng hoạt động bằng cách chỉ kiểm tra một ký tự cùng một lúc.

+0

chấp nhận câu trả lời được chấp nhận sau 8 phút. cảm ơn bạn rất nhiều – none

0

Lý do mã của bạn không hoạt động được giải thích rất tốt bởi @Benjamin trong câu trả lời của anh ấy. Vì vậy, tôi sẽ cho bạn thấy một giải pháp thay thế.

Không cần phải tách thủ công. Đối với trường hợp cụ thể của bạn, std::stringstream là thích hợp:

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

Output (demo):

firstline 
secondline 
thirdline 
fourthline 
+0

điều này không làm những gì OP được yêu cầu, bạn chia 'đầu vào' bởi mỗi '\ n', ngay cả khi nó mang lại kết quả" đúng "(in) trong trường hợp này, bạn nên chia nó thành hai '\ n'. –

+0

@refp: Nó làm những gì OP hỏi, nhưng khác nhau. – Nawaz

+1

"Tôi đã cố gắng tách một chuỗi bằng các dòng mới kép", không có nơi nào bạn chia tách bằng các dòng mới kép. –

1

Làm thế nào về phương pháp này:

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

Nó mang lại cho tôi:

[firstline 
secondline] 
[thirdline 
fourthline] 

là kết quả, mà về cơ bản là những gì bạn muốn, đúng không?

Các vấn đề liên quan