2012-05-10 34 views
9

Trong chương trình của tôi C++, tôi có một chuỗiLàm thế nào để loại bỏ một chuỗi con cụ thể khỏi một chuỗi?

string s = "/usr/file.gz"; 

Ở đây, làm thế nào để làm cho kịch bản để kiểm tra gz gia hạn (bất kể tên tập tin là) và chia nó như "/usr/file"?

+0

http://stackoverflow.com/a/874160/276994 – Vlad

+0

thể trùng lặp của [Tìm nếu chuỗi endswith một chuỗi trong C++] (http://stackoverflow.com/questions/874134/find -if-string-endswith-another-string-in-c) –

+0

@Vlad bạn nên đóng phiếu bầu, thay vì liên kết –

Trả lời

8

Làm thế nào về:

// Check if the last three characters match the ext. 
const std::string ext(".gz"); 
if (s != ext && 
    s.size() > ext.size() && 
    s.substr(s.size() - ext.size()) == ".gz") 
{ 
    // if so then strip them off 
    s = s.substr(0, s.size() - ext.size()); 
} 
+0

Kiểm tra 's.size()> = 3' trước tiên. –

+0

substr() luôn tạo đối tượng mới. Nó không phải là âm thanh tốt bởi lý do hiệu suất. – Alexander

+0

@Alexander: Đúng, nhưng không có đề cập đến cân nhắc hiệu suất trong câu hỏi. –

26

Bạn có thể sử dụng erase cho các ký hiệu loại bỏ:

str.erase(start_position_to_erase, number_of_symbols); 

Và bạn có thể sử dụng find để tìm thấy vị trí bắt đầu:

start_position_to_erase = str.find("smth-to-delete"); 
+0

@ schorsch312 bình luận của bạn bây giờ gây nhầm lẫn cho tôi. – gsamaras

1

Nếu bạn có thể sử dụng C++ 11, bạn có thể sử dụng #include <regex> hoặc nếu bạn đang mắc kẹt với C++ 0 3 bạn có thể sử dụng Boost.Regex (hoặc PCRE) để tạo thành một biểu thức chính quy thích hợp để phá vỡ các phần của tên tệp mà bạn muốn. Một cách tiếp cận khác là sử dụng Boost.Filesystem để phân tích đường dẫn đúng cách.

+6

regex nên là một overkill cho một nhiệm vụ đơn giản như vậy – Vlad

-4
#include <bits/stdc++.h> 

using namespace std; 

int main() 
{ 

    char ch[80], c[80]; 
    int s, d; 

    cin >> ch >> s >> d; 
int  k = 0; 
    int l = strlen(ch); 

    s= s -1; 
    d = d + s; 
    for(int i = 0; i < l; i++) 
    { 
     if(i < d){ 
      if(i == s) 
      { 
       s++; 
       continue; 
      } 
     } 
     c[k++] = ch[i]; 
    } 
    c[k] = '\0'; 
    cout << c; 

} 
+2

Bạn có nhớ giải thích những gì mã không? Sau đó, nó thậm chí còn hữu ích hơn cho những người khác vấp ngã xung quanh vấn đề đó sau này. – wmk

0
void stripExtension(std::string &path) 
{ 
    int dot = path.rfind(".gz"); 
    if (dot != std::string::npos) 
    { 
     path.resize(dot); 
    } 
} 
Các vấn đề liên quan