2012-05-10 15 views
9

In meinem C++ Programm habe ich eine ZeichenfolgeWie entferne ich einen bestimmten Teilstring aus einem String?

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

Hier, wie das Skript zu machen für gz Erweiterung zu überprüfen (was auch immer der Dateiname) und teilen Sie es wie "/usr/file"?

+0

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

+0

möglich Duplikat [Finden Sie, wenn der String endswith eine andere Zeichenfolge in C++] (http://stackoverflow.com/questions/874134/find -if-string-endswith-anderen-string-in-c) –

+0

@Vlad sollten Sie Abstimmung schließen, anstatt zu verknüpfen –

Antwort

8

Wie wäre:

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

Zuerst 's.size()> = 3' prüfen. –

+0

substr() erstellt immer ein neues Objekt. Aus Performance-Gründen klingt das nicht gut. – Alexander

+0

@Alexander: Das stimmt, aber es gab keine Erwähnung von Leistungsinformationen in der Frage. –

26

Sie können erase zum Entfernen Symbole verwenden:

str.erase(start_position_to_erase, number_of_symbols); 

Und Sie können find Startposition verwenden Sie:

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

@ schorsch312 Ihr Kommentar verwirrt mich jetzt. – gsamaras

1

Wenn Sie in der Lage, C++ 11 zu verwenden, können Sie #include <regex> verwenden oder wenn Sie mit C++ 0 festhängen 3 können Sie Boost.Regex (oder PCRE) verwenden, um einen ordentlichen regulären Ausdruck zu bilden, um die Teile eines gewünschten Dateinamens auszubrechen. Ein anderer Ansatz besteht darin, Boost.Filesystem zum korrekten Parsen von Pfaden zu verwenden.

+6

Regex sollte ein Overkill für solch eine einfache Aufgabe sein – 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

Würde es Ihnen etwas ausmachen, zu erklären, was der Code tut? Dann ist es noch nützlicher für andere, die später um dieses Problem stolpern. – wmk

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