2012-05-12 38 views
14

Ví dụ, giả sử tôi có std::string chứa đường dẫn UNIX-phong cách cho một số tập tin:cách hiệu quả để cắt chuỗi theo chiều dài N

string path("/first/second/blah/myfile"); 

Giả sử bây giờ tôi muốn vứt bỏ thông tin tập tin có liên quan và nhận được đường dẫn đến ' blah 'thư mục từ chuỗi này. Vì vậy, có một hiệu quả (nói 'hiệu quả' tôi có nghĩa là 'mà không có bất kỳ bản sao') cách cắt ngắn chuỗi này để nó có chứa "/first/second/blah" chỉ?

Xin cảm ơn trước.

Trả lời

30

Nếu N được biết đến, bạn có thể sử dụng

path.erase(N, std::string::npos); 

Nếu N không được biết đến và bạn muốn tìm thấy nó, bạn có thể sử dụng bất kỳ chức năng tìm kiếm. Trong trường hợp này bạn sẽ muốn tìm dấu gạch chéo cuối cùng, vì vậy bạn có thể sử dụng rfind hoặc find_last_of:

path.erase(path.rfind('/'), std::string::npos); 
path.erase(path.find_last_of('/'), std::string::npos); 

Thậm chí còn có một biến thể của việc này dựa trên vòng lặp:

path.erase (path.begin() + path.rfind('/'), path.end()); 

Điều đó nói rằng, nếu bạn sẽ điều khiển các đường dẫn cho cuộc sống, tốt hơn là sử dụng thư viện được thiết kế cho tác vụ này, chẳng hạn như Boost Filesystem.

+0

Chính xác những gì tôi muốn! Tôi biết rằng phải có cách _beautiful_ làm điều này :) Cảm ơn. – tonytony

+0

Hoặc nhiều cách đẹp :) – chris

+0

Tôi đã chỉnh sửa câu trả lời, std :: string :: npos thay cho std :: npos. npos là một thành viên của std :: string not std –

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