2010-08-26 16 views
7

Tôi muốn sử dụng chuỗi Tokenizer cho chuỗi CPP nhưng tất cả những gì tôi có thể tìm được là cho Char *. Có điều gì tương tự cho chuỗi CPP không?Trình mã thông báo chuỗi cho chuỗi CPP?

+17

Làm thế nào về một số ví dụ sau: http://www.codeproject.com/KB/recipes/Tokenizer. aspx Họ rất hiệu quả và phần nào thanh lịch. Thư viện String Toolkit làm cho việc xử lý chuỗi phức tạp trong C++ đơn giản và dễ dàng. –

+0

có thể trùng lặp của [Sử dụng strtok với chuỗi tiêu chuẩn ::] (http://stackoverflow.com/questions/289347/using-strtok-with-a-stdstring) – bobobobo

Trả lời

7

Bạn có ý nghĩa gì với "mã thông báo"? Nếu đó là một cái gì đó ngăn cách bởi bất kỳ khoảng trắng, các con suối chuỗi là những gì bạn muốn:

std::istringstream iss("blah wrxgl bxrcy") 
for(;;) { 
    std::string token; 
    if(!(iss>>token)) break; 
    process(token); 
} 
if(!iss.eof()) report_error(); 

Ngoài ra, nếu bạn đang tìm kiếm một một nhân vật duy nhất cần phải phân loại nhất định, bạn có thể thay thế iss>>token với std::getline(iss,token,sep_char).

Nếu có nhiều hơn một ký tự có thể hoạt động như một dấu tách (và nếu nó không phải là khoảng trắng), kết hợp std::string::find_first()std::string::substr() sẽ làm.

+1

+1 cho ba lựa chọn thay thế – Chubsdad

+0

Có lý do chính đáng nào để thích 'for (;;)' over 'while (iss >> token)' (giả sử 'token' được khai báo trước vòng lặp) không? Trong ví dụ này, nó sẽ là một dòng ngắn hơn, và, theo ý kiến ​​của tôi, ít nhất là không thể đọc được. –

+0

@ Space_C0wb0y: (Bây giờ tôi chỉ hiểu được bình luận của bạn thôi. Ít nhất thì tôi nghĩ là mình ...) Tôi chỉ thích một biến cục bộ hơn là sự lặp lại của vòng lặp 'while'. – sbi

0

Check-out algos STL như find_first_of, find_first_not_of và vân vân để tạo ra một tùy chỉnh một.

0

Hãy thử đoạn này tôi thấy ở đâu đó (thậm chí có thể quanh đây?):

#include <string> 
#include <vector> 
#include <sstream> 

std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) { 
    std::stringstream ss(s); 
    std::string item; 
    while(std::getline(ss, item, delim)) { 
     elems.push_back(item); 
    } 
    return elems; 
} 


std::vector<std::string> split(const std::string &s, char delim) { 
    std::vector<std::string> elems; 
    return split(s, delim, elems); 
} 
Các vấn đề liên quan