2012-05-10 14 views
9

En mi programa en C++, tengo una cadena¿Cómo eliminar una subcadena particular de una cadena?

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

Aquí, cómo hacer que la secuencia de comandos para comprobar si hay extensión .gz (cualquiera que sea el nombre del archivo es), que se dividió como "/usr/file"?

+0

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

+0

posible duplicado de [Encuentra si la cadena endswith otra cadena en C++] (http://stackoverflow.com/questions/874134/find -if-string-endswith-another-string-in-c) –

+0

@Vlad debe cerrar el voto, en lugar de vincular –

Respuesta

8

¿Qué tal:

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

Compruebe 's.size()> = 3' primero. –

+0

substr() siempre crea un objeto nuevo. No suena bien por razones de rendimiento. – Alexander

+0

@Alexander: Es cierto, pero no se mencionaron las consideraciones de rendimiento en la pregunta. –

26

Se puede utilizar para erase de no incluir símbolos:

str.erase(start_position_to_erase, number_of_symbols); 

Y puede utilizar para fundar find posición de partida:

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

@ schorsch312 ahora me confunde su comentario. – gsamaras

1

Si eres capaz de usar C++ 11, puede usar #include <regex> o si tiene problemas con C++ 0 3 puede usar Boost.Regex (o PCRE) para formar una expresión regular adecuada para dividir las partes de un nombre de archivo que desee. Otro enfoque es usar Boost.Filesystem para analizar rutas de manera adecuada.

+6

regex debería ser un exceso para una tarea tan simple – 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

¿Le importaría explicar lo que hace el código? Entonces es aún más útil para otros que se tropiecen con ese problema más tarde. Gracias. – wmk

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