2012-05-10 5 views
9

В моей программе C++, у меня есть строкаКак удалить определенную подстроку из строки?

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

Здесь, как сделать скрипт для проверки .gz (независимо расширением имени файла есть) и разделить его как "/usr/file"?

+0

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

+0

возможно дубликат [Find, если строка EndsWith другой строки в C++] (http://stackoverflow.com/questions/874134/find -if-string-endswith-another-string-in-c) –

+0

@ Vlad вам следует закрыть голосование, вместо ссылки –

ответ

8

Как о:

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

Сначала проверьте 's.size()> = 3'. –

+0

substr() всегда создает новый объект. По соображениям производительности это звучит не очень хорошо. – Alexander

+0

@ Александр: Верно, но не было упоминания о соображениях производительности в вопросе. –

26

Вы можете использовать erase для удаления символов:

str.erase(start_position_to_erase, number_of_symbols); 

И вы можете использовать find основать стартовую позицию:

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

@ schorsch312 ваш комментарий теперь меня смущает. – gsamaras

1

Если вы умеет использовать C++ 11, вы можете использовать #include <regex> или если вы застряли с C++ 0 3 вы можете использовать Boost.Regex (или PCRE), чтобы сформировать правильное регулярное выражение, чтобы разбить части требуемого имени файла. Другой подход - использовать Boost.Filesystem для правильной обработки путей.

+6

regex должен быть излишним для такой простой задачи – 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

Не могли бы вы объяснить, что делает код? Тогда это еще более полезно для других, которые спотыкаются об этой проблеме позже. – wmk

0
void stripExtension(std::string &path) 
{ 
    int dot = path.rfind(".gz"); 
    if (dot != std::string::npos) 
    { 
     path.resize(dot); 
    } 
} 
Смежные вопросы