2012-05-10 4 views
9

W moim programie C++, mam ciągJak usunąć konkretny podciąg z łańcucha?

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

Oto, jak zrobić skrypt, aby sprawdzić .gz przedłużeniem (niezależnie od nazwy pliku) i podzielony jest jak "/usr/file"?

+0

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

+0

możliwe duplikat [Znajdź jeśli ciąg endswith innym ciągiem w C++] (http://stackoverflow.com/questions/874134/find -if-string-endswith-in-string-in-c) –

+0

@Vlad powinieneś zamknąć głosowanie, zamiast łączenia –

Odpowiedz

8

Jak o:

// 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

Najpierw sprawdź 's.size()> = 3'. –

+0

substr() zawsze tworzy nowy obiekt. To nie brzmi dobrze ze względu na wydajność. – Alexander

+0

@Alexander: To prawda, ale w pytaniu nie było wzmianki o rozważaniach dotyczących wydajności. –

26

Można użyć erase do usuwania symboli:

str.erase(start_position_to_erase, number_of_symbols); 

i można korzystać find aby znaleźć pozycję wyjściową:

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

@ schorsch312 Twój komentarz teraz mnie myli. – gsamaras

1

Jeśli jesteś możliwość używania C++ 11, możesz użyć #include <regex> lub jeśli utkniesz w C++ 0 3 można użyć Boost.Regex (lub PCRE), aby utworzyć prawidłowe wyrażenie regularne, aby wydzielić części nazwy pliku, który chcesz. Innym podejściem jest użycie Boost.Filesystem do prawidłowego analizowania ścieżek.

+6

regex powinien być przesadą dla tak prostego zadania – 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

Czy mógłbyś wyjaśnić, co robi kod? Wtedy jest jeszcze bardziej użyteczny dla innych, którzy natkną się na ten problem później. – wmk

0
void stripExtension(std::string &path) 
{ 
    int dot = path.rfind(".gz"); 
    if (dot != std::string::npos) 
    { 
     path.resize(dot); 
    } 
}